Copy disabled (too large)
Download .txt
Showing preview only (49,221K chars total). Download the full file to get everything.
Repository: google/jsonnet
Branch: master
Commit: d33798d495d5
Files: 3640
Total size: 46.1 MB
Directory structure:
gitextract_p_3vr9vi/
├── .bazelignore
├── .bazelversion
├── .clang-format
├── .gitattributes
├── .github/
│ └── workflows/
│ ├── build_and_test.yml
│ ├── create_archive.sh
│ ├── doc_update.yml
│ ├── publish-python.yml
│ └── release.yml
├── .gitignore
├── CMakeLists.txt
├── CONTRIBUTING
├── Dockerfile
├── LICENSE
├── MANIFEST.in
├── MODULE.bazel
├── PYTHON_README.md
├── README.md
├── benchmarks/
│ ├── .gitignore
│ ├── bench.01.jsonnet
│ ├── bench.02.jsonnet
│ ├── bench.03.jsonnet
│ ├── bench.04.jsonnet
│ ├── bench.06.jsonnet
│ ├── bench.07.jsonnet
│ ├── bench.08.jsonnet
│ ├── bench.09.jsonnet
│ ├── gen_big_object.jsonnet
│ └── regen_benchmarks.sh
├── case_studies/
│ ├── fractal/
│ │ ├── .gitignore
│ │ ├── appserv/
│ │ │ ├── main.py
│ │ │ ├── static/
│ │ │ │ └── style.css
│ │ │ └── templates/
│ │ │ ├── base.html
│ │ │ ├── error.html
│ │ │ └── page.html
│ │ ├── credentials.libsonnet.TEMPLATE
│ │ ├── lib/
│ │ │ ├── cassandra.libsonnet
│ │ │ ├── packer.libsonnet
│ │ │ └── terraform.libsonnet
│ │ ├── service.jsonnet
│ │ └── tilegen/
│ │ ├── mandelbrot.cpp
│ │ └── mandelbrot_service.py
│ ├── kubernetes/
│ │ ├── README.md
│ │ ├── bigquery-controller.old.yaml
│ │ ├── example.jsonnet
│ │ ├── kube.libsonnet
│ │ ├── redis-master-service.old.yaml
│ │ ├── redis-master.old.yaml
│ │ ├── test_same.py
│ │ └── twitter-stream.old.yaml
│ ├── micro_fractal/
│ │ ├── .gitignore
│ │ ├── appserv/
│ │ │ ├── main.py
│ │ │ ├── static/
│ │ │ │ └── style.css
│ │ │ └── templates/
│ │ │ ├── base.html
│ │ │ ├── error.html
│ │ │ └── page.html
│ │ ├── db/
│ │ │ ├── db_export.sh
│ │ │ ├── db_import.sh
│ │ │ └── nodetool.sh
│ │ ├── fractal.jsonnet
│ │ ├── fractal_dev.jsonnet.TEMPLATE
│ │ └── tilegen/
│ │ ├── mandelbrot.cpp
│ │ └── mandelbrot_service.py
│ └── micromanage/
│ ├── .gitignore
│ ├── build_artefact.py
│ ├── cmds.py
│ ├── examples/
│ │ ├── hello_world_amazon.jsonnet
│ │ └── hello_world_google.jsonnet
│ ├── lib/
│ │ └── mmlib/
│ │ └── v0.1.2/
│ │ ├── amis/
│ │ │ ├── debian.libsonnet
│ │ │ ├── ubuntu.libsonnet
│ │ │ ├── ubuntu.prof
│ │ │ └── ubuntu_raw.json
│ │ ├── cmd/
│ │ │ ├── apt.libsonnet
│ │ │ ├── cmd.libsonnet
│ │ │ └── pip.libsonnet
│ │ ├── db/
│ │ │ └── cassandra.libsonnet
│ │ ├── service/
│ │ │ ├── amazon.libsonnet
│ │ │ ├── base.libsonnet
│ │ │ └── google.libsonnet
│ │ └── web/
│ │ ├── nginx.libsonnet
│ │ ├── solutions.libsonnet
│ │ ├── uwsgi_flask.libsonnet
│ │ └── web.libsonnet
│ ├── micromanage
│ ├── micromanage.py
│ ├── packer.py
│ ├── service.py
│ ├── service_amazon.py
│ ├── service_google.py
│ ├── tests/
│ │ ├── amazon/
│ │ │ └── test_single_instance.jsonnet
│ │ ├── google/
│ │ │ ├── test_empty.jsonnet
│ │ │ ├── test_nested.jsonnet
│ │ │ └── test_single_instance.jsonnet
│ │ ├── test_really_empty.jsonnet
│ │ └── testenv.libsonnet.TEMPLATE
│ ├── util.py
│ └── validate.py
├── cmd/
│ ├── BUILD
│ ├── jsonnet.cpp
│ ├── jsonnetfmt.cpp
│ ├── utils.cpp
│ └── utils.h
├── cpp/
│ ├── BUILD
│ ├── libjsonnet++.cpp
│ ├── libjsonnet++_test.cpp
│ ├── libjsonnet_locale_test.cpp
│ └── testdata/
│ ├── BUILD
│ ├── example.jsonnet
│ ├── example_golden.json
│ ├── importing.jsonnet
│ ├── importing_golden.json
│ ├── invalid.jsonnet
│ └── invalid.out
├── doc/
│ ├── .gitignore
│ ├── CNAME
│ ├── _config.yml
│ ├── _includes/
│ │ ├── demo.inc
│ │ └── examples/
│ │ ├── arith.jsonnet
│ │ ├── arith.jsonnet.golden
│ │ ├── cocktail-comprehensions.jsonnet
│ │ ├── cocktail-comprehensions.jsonnet.golden
│ │ ├── comprehensions.jsonnet
│ │ ├── comprehensions.jsonnet.golden
│ │ ├── computed-fields.jsonnet
│ │ ├── computed-fields.jsonnet.golden
│ │ ├── conditionals.jsonnet
│ │ ├── conditionals.jsonnet.golden
│ │ ├── error-examples.jsonnet
│ │ ├── error-examples.jsonnet.golden
│ │ ├── functions.jsonnet
│ │ ├── functions.jsonnet.golden
│ │ ├── garnish.txt
│ │ ├── imports.jsonnet
│ │ ├── imports.jsonnet.golden
│ │ ├── inner-reference.jsonnet
│ │ ├── inner-reference.jsonnet.golden
│ │ ├── library-ext.libsonnet
│ │ ├── library-tla.libsonnet
│ │ ├── martinis.libsonnet
│ │ ├── mixins.jsonnet
│ │ ├── mixins.jsonnet.golden
│ │ ├── negroni.jsonnet
│ │ ├── negroni.jsonnet.golden
│ │ ├── oo-contrived.jsonnet
│ │ ├── oo-contrived.jsonnet.golden
│ │ ├── references.jsonnet
│ │ ├── references.jsonnet.golden
│ │ ├── sours-oo.jsonnet
│ │ ├── sours-oo.jsonnet.golden
│ │ ├── sours.jsonnet
│ │ ├── sours.jsonnet.golden
│ │ ├── syntax.jsonnet
│ │ ├── syntax.jsonnet.golden
│ │ ├── templates.libsonnet
│ │ ├── top-level-ext.jsonnet
│ │ ├── top-level-ext.jsonnet.golden
│ │ ├── top-level-tla.jsonnet
│ │ ├── top-level-tla.jsonnet.golden
│ │ ├── utils.libsonnet
│ │ ├── variables.jsonnet
│ │ └── variables.jsonnet.golden
│ ├── _layouts/
│ │ ├── base.html
│ │ ├── default.html
│ │ ├── markdown.html
│ │ ├── redirect.html
│ │ ├── stdlib.html
│ │ └── wide.html
│ ├── _stdlib_gen/
│ │ ├── html.libsonnet
│ │ ├── jekyll.libsonnet
│ │ ├── run_tests.sh
│ │ ├── stdlib-content-test.jsonnet
│ │ ├── stdlib-content.jsonnet
│ │ └── stdlib.jsonnet
│ ├── articles/
│ │ ├── comparisons.html
│ │ ├── design.html
│ │ ├── fractal.1.html
│ │ ├── fractal.2.html
│ │ ├── fractal.3.html
│ │ ├── kubernetes.html
│ │ └── output-formats.html
│ ├── case_studies/
│ │ └── casestudy_fractal.1.html
│ ├── contributing.html
│ ├── css/
│ │ ├── cellphone-small.css
│ │ ├── cellphone.css
│ │ ├── desktop.css
│ │ └── doc.css
│ ├── docs/
│ │ ├── index.html
│ │ ├── stdlib.html
│ │ └── tutorial.html
│ ├── index.html
│ ├── js/
│ │ ├── codemirror-mode-jsonnet.js
│ │ ├── demo.js
│ │ ├── menu.js
│ │ └── wasm_exec.js
│ ├── language/
│ │ └── spec.html
│ ├── learning/
│ │ ├── community.html
│ │ ├── getting_started.html
│ │ ├── tools.html
│ │ └── tutorial.html
│ ├── ref/
│ │ ├── bindings.html
│ │ ├── language.html.md
│ │ ├── spec.html
│ │ └── stdlib.html
│ └── third_party/
│ ├── CodeMirror/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── addon/
│ │ │ └── edit/
│ │ │ └── matchbrackets.js
│ │ ├── lib/
│ │ │ ├── codemirror.css
│ │ │ └── codemirror.js
│ │ └── mode/
│ │ └── yaml/
│ │ └── yaml.js
│ ├── MathJax-2.7.2/
│ │ ├── .gitignore
│ │ ├── .npmignore
│ │ ├── .travis.yml
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── MathJax.js
│ │ ├── README.md
│ │ ├── bower.json
│ │ ├── composer.json
│ │ ├── config/
│ │ │ ├── AM_CHTML-full.js
│ │ │ ├── AM_CHTML.js
│ │ │ ├── AM_HTMLorMML-full.js
│ │ │ ├── AM_HTMLorMML.js
│ │ │ ├── AM_SVG-full.js
│ │ │ ├── AM_SVG.js
│ │ │ ├── Accessible-full.js
│ │ │ ├── Accessible.js
│ │ │ ├── MML_CHTML-full.js
│ │ │ ├── MML_CHTML.js
│ │ │ ├── MML_HTMLorMML-full.js
│ │ │ ├── MML_HTMLorMML.js
│ │ │ ├── MML_SVG-full.js
│ │ │ ├── MML_SVG.js
│ │ │ ├── MMLorHTML.js
│ │ │ ├── Safe.js
│ │ │ ├── TeX-AMS-MML_HTMLorMML-full.js
│ │ │ ├── TeX-AMS-MML_HTMLorMML.js
│ │ │ ├── TeX-AMS-MML_SVG-full.js
│ │ │ ├── TeX-AMS-MML_SVG.js
│ │ │ ├── TeX-AMS_CHTML-full.js
│ │ │ ├── TeX-AMS_CHTML.js
│ │ │ ├── TeX-AMS_HTML-full.js
│ │ │ ├── TeX-AMS_HTML.js
│ │ │ ├── TeX-AMS_SVG-full.js
│ │ │ ├── TeX-AMS_SVG.js
│ │ │ ├── TeX-MML-AM_CHTML-full.js
│ │ │ ├── TeX-MML-AM_CHTML.js
│ │ │ ├── TeX-MML-AM_HTMLorMML-full.js
│ │ │ ├── TeX-MML-AM_HTMLorMML.js
│ │ │ ├── TeX-MML-AM_SVG-full.js
│ │ │ ├── TeX-MML-AM_SVG.js
│ │ │ ├── default.js
│ │ │ └── local/
│ │ │ └── local.js
│ │ ├── docs/
│ │ │ ├── README.txt
│ │ │ ├── html/
│ │ │ │ └── index.html
│ │ │ └── source/
│ │ │ └── README.txt
│ │ ├── extensions/
│ │ │ ├── AssistiveMML.js
│ │ │ ├── CHTML-preview.js
│ │ │ ├── FontWarnings.js
│ │ │ ├── HTML-CSS/
│ │ │ │ └── handle-floats.js
│ │ │ ├── HelpDialog.js
│ │ │ ├── MatchWebFonts.js
│ │ │ ├── MathEvents.js
│ │ │ ├── MathML/
│ │ │ │ ├── content-mathml.js
│ │ │ │ └── mml3.js
│ │ │ ├── MathMenu.js
│ │ │ ├── MathZoom.js
│ │ │ ├── Safe.js
│ │ │ ├── TeX/
│ │ │ │ ├── AMScd.js
│ │ │ │ ├── AMSmath.js
│ │ │ │ ├── AMSsymbols.js
│ │ │ │ ├── HTML.js
│ │ │ │ ├── action.js
│ │ │ │ ├── autobold.js
│ │ │ │ ├── autoload-all.js
│ │ │ │ ├── bbox.js
│ │ │ │ ├── begingroup.js
│ │ │ │ ├── boldsymbol.js
│ │ │ │ ├── cancel.js
│ │ │ │ ├── color.js
│ │ │ │ ├── enclose.js
│ │ │ │ ├── extpfeil.js
│ │ │ │ ├── mathchoice.js
│ │ │ │ ├── mediawiki-texvc.js
│ │ │ │ ├── mhchem.js
│ │ │ │ ├── mhchem3/
│ │ │ │ │ └── mhchem.js
│ │ │ │ ├── newcommand.js
│ │ │ │ ├── noErrors.js
│ │ │ │ ├── noUndefined.js
│ │ │ │ ├── unicode.js
│ │ │ │ └── verb.js
│ │ │ ├── a11y/
│ │ │ │ ├── accessibility-menu.js
│ │ │ │ ├── auto-collapse.js
│ │ │ │ ├── collapsible.js
│ │ │ │ ├── explorer.js
│ │ │ │ ├── invalid_keypress.ogg
│ │ │ │ ├── mathjax-sre.js
│ │ │ │ ├── mathmaps/
│ │ │ │ │ ├── .htaccess
│ │ │ │ │ ├── functions/
│ │ │ │ │ │ ├── algebra.js
│ │ │ │ │ │ ├── elementary.js
│ │ │ │ │ │ ├── hyperbolic.js
│ │ │ │ │ │ └── trigonometry.js
│ │ │ │ │ ├── mathmaps_ie.js
│ │ │ │ │ ├── symbols/
│ │ │ │ │ │ ├── greek-capital.js
│ │ │ │ │ │ ├── greek-mathfonts.js
│ │ │ │ │ │ ├── greek-scripts.js
│ │ │ │ │ │ ├── greek-small.js
│ │ │ │ │ │ ├── greek-symbols.js
│ │ │ │ │ │ ├── hebrew_letters.js
│ │ │ │ │ │ ├── latin-lower-double-accent.js
│ │ │ │ │ │ ├── latin-lower-normal.js
│ │ │ │ │ │ ├── latin-lower-phonetic.js
│ │ │ │ │ │ ├── latin-lower-single-accent.js
│ │ │ │ │ │ ├── latin-mathfonts.js
│ │ │ │ │ │ ├── latin-rest.js
│ │ │ │ │ │ ├── latin-upper-double-accent.js
│ │ │ │ │ │ ├── latin-upper-normal.js
│ │ │ │ │ │ ├── latin-upper-single-accent.js
│ │ │ │ │ │ ├── math_angles.js
│ │ │ │ │ │ ├── math_arrows.js
│ │ │ │ │ │ ├── math_characters.js
│ │ │ │ │ │ ├── math_delimiters.js
│ │ │ │ │ │ ├── math_digits.js
│ │ │ │ │ │ ├── math_geometry.js
│ │ │ │ │ │ ├── math_harpoons.js
│ │ │ │ │ │ ├── math_non_characters.js
│ │ │ │ │ │ ├── math_symbols.js
│ │ │ │ │ │ ├── math_whitespace.js
│ │ │ │ │ │ └── other_stars.js
│ │ │ │ │ └── units/
│ │ │ │ │ ├── energy.js
│ │ │ │ │ ├── length.js
│ │ │ │ │ ├── memory.js
│ │ │ │ │ ├── other.js
│ │ │ │ │ ├── speed.js
│ │ │ │ │ ├── temperature.js
│ │ │ │ │ ├── time.js
│ │ │ │ │ ├── volume.js
│ │ │ │ │ └── weight.js
│ │ │ │ ├── semantic-enrich.js
│ │ │ │ └── wgxpath.install.js
│ │ │ ├── asciimath2jax.js
│ │ │ ├── fast-preview.js
│ │ │ ├── jsMath2jax.js
│ │ │ ├── mml2jax.js
│ │ │ ├── tex2jax.js
│ │ │ └── toMathML.js
│ │ ├── fonts/
│ │ │ └── HTML-CSS/
│ │ │ ├── Asana-Math/
│ │ │ │ ├── OFL.txt
│ │ │ │ └── otf/
│ │ │ │ ├── AsanaMathJax_Alphabets-Regular.otf
│ │ │ │ ├── AsanaMathJax_Arrows-Regular.otf
│ │ │ │ ├── AsanaMathJax_DoubleStruck-Regular.otf
│ │ │ │ ├── AsanaMathJax_Fraktur-Regular.otf
│ │ │ │ ├── AsanaMathJax_Latin-Regular.otf
│ │ │ │ ├── AsanaMathJax_Main-Regular.otf
│ │ │ │ ├── AsanaMathJax_Marks-Regular.otf
│ │ │ │ ├── AsanaMathJax_Misc-Regular.otf
│ │ │ │ ├── AsanaMathJax_Monospace-Regular.otf
│ │ │ │ ├── AsanaMathJax_NonUnicode-Regular.otf
│ │ │ │ ├── AsanaMathJax_Normal-Regular.otf
│ │ │ │ ├── AsanaMathJax_Operators-Regular.otf
│ │ │ │ ├── AsanaMathJax_SansSerif-Regular.otf
│ │ │ │ ├── AsanaMathJax_Script-Regular.otf
│ │ │ │ ├── AsanaMathJax_Shapes-Regular.otf
│ │ │ │ ├── AsanaMathJax_Size1-Regular.otf
│ │ │ │ ├── AsanaMathJax_Size2-Regular.otf
│ │ │ │ ├── AsanaMathJax_Size3-Regular.otf
│ │ │ │ ├── AsanaMathJax_Size4-Regular.otf
│ │ │ │ ├── AsanaMathJax_Size5-Regular.otf
│ │ │ │ ├── AsanaMathJax_Size6-Regular.otf
│ │ │ │ ├── AsanaMathJax_Symbols-Regular.otf
│ │ │ │ └── AsanaMathJax_Variants-Regular.otf
│ │ │ ├── Gyre-Pagella/
│ │ │ │ ├── GUST-FONT-LICENSE.txt
│ │ │ │ ├── MANIFEST-GyrePagellaMathJax.txt
│ │ │ │ └── otf/
│ │ │ │ ├── GyrePagellaMathJax_Alphabets-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Arrows-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_DoubleStruck-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Fraktur-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Latin-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Main-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Marks-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Misc-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Monospace-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_NonUnicode-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Normal-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Operators-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_SansSerif-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Script-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Shapes-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Size1-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Size2-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Size3-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Size4-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Size5-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Size6-Regular.otf
│ │ │ │ ├── GyrePagellaMathJax_Symbols-Regular.otf
│ │ │ │ └── GyrePagellaMathJax_Variants-Regular.otf
│ │ │ ├── Gyre-Termes/
│ │ │ │ ├── GUST-FONT-LICENSE.txt
│ │ │ │ ├── MANIFEST-GyreTermesMathJax.txt
│ │ │ │ └── otf/
│ │ │ │ ├── GyreTermesMathJax_Alphabets-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Arrows-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_DoubleStruck-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Fraktur-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Latin-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Main-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Marks-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Misc-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Monospace-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_NonUnicode-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Normal-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Operators-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_SansSerif-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Script-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Shapes-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Size1-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Size2-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Size3-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Size4-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Size5-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Size6-Regular.otf
│ │ │ │ ├── GyreTermesMathJax_Symbols-Regular.otf
│ │ │ │ └── GyreTermesMathJax_Variants-Regular.otf
│ │ │ ├── Latin-Modern/
│ │ │ │ ├── GUST-FONT-LICENSE.txt
│ │ │ │ ├── MANIFEST-LatinModernMathJax.txt
│ │ │ │ └── otf/
│ │ │ │ ├── LatinModernMathJax_Alphabets-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Arrows-Regular.otf
│ │ │ │ ├── LatinModernMathJax_DoubleStruck-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Fraktur-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Latin-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Main-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Marks-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Misc-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Monospace-Regular.otf
│ │ │ │ ├── LatinModernMathJax_NonUnicode-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Normal-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Operators-Regular.otf
│ │ │ │ ├── LatinModernMathJax_SansSerif-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Script-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Shapes-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Size1-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Size2-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Size3-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Size4-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Size5-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Size6-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Size7-Regular.otf
│ │ │ │ ├── LatinModernMathJax_Symbols-Regular.otf
│ │ │ │ └── LatinModernMathJax_Variants-Regular.otf
│ │ │ ├── Neo-Euler/
│ │ │ │ ├── OFL.txt
│ │ │ │ └── otf/
│ │ │ │ ├── NeoEulerMathJax_Alphabets-Regular.otf
│ │ │ │ ├── NeoEulerMathJax_Arrows-Regular.otf
│ │ │ │ ├── NeoEulerMathJax_Fraktur-Regular.otf
│ │ │ │ ├── NeoEulerMathJax_Main-Regular.otf
│ │ │ │ ├── NeoEulerMathJax_Marks-Regular.otf
│ │ │ │ ├── NeoEulerMathJax_NonUnicode-Regular.otf
│ │ │ │ ├── NeoEulerMathJax_Normal-Regular.otf
│ │ │ │ ├── NeoEulerMathJax_Operators-Regular.otf
│ │ │ │ ├── NeoEulerMathJax_Script-Regular.otf
│ │ │ │ ├── NeoEulerMathJax_Shapes-Regular.otf
│ │ │ │ ├── NeoEulerMathJax_Size1-Regular.otf
│ │ │ │ ├── NeoEulerMathJax_Size2-Regular.otf
│ │ │ │ ├── NeoEulerMathJax_Size3-Regular.otf
│ │ │ │ ├── NeoEulerMathJax_Size4-Regular.otf
│ │ │ │ ├── NeoEulerMathJax_Size5-Regular.otf
│ │ │ │ ├── NeoEulerMathJax_Symbols-Regular.otf
│ │ │ │ └── NeoEulerMathJax_Variants-Regular.otf
│ │ │ ├── STIX-Web/
│ │ │ │ ├── OFL.txt
│ │ │ │ └── otf/
│ │ │ │ ├── STIXMathJax_Alphabets-Bold.otf
│ │ │ │ ├── STIXMathJax_Alphabets-BoldItalic.otf
│ │ │ │ ├── STIXMathJax_Alphabets-Italic.otf
│ │ │ │ ├── STIXMathJax_Alphabets-Regular.otf
│ │ │ │ ├── STIXMathJax_Arrows-Bold.otf
│ │ │ │ ├── STIXMathJax_Arrows-Regular.otf
│ │ │ │ ├── STIXMathJax_DoubleStruck-Bold.otf
│ │ │ │ ├── STIXMathJax_DoubleStruck-BoldItalic.otf
│ │ │ │ ├── STIXMathJax_DoubleStruck-Italic.otf
│ │ │ │ ├── STIXMathJax_DoubleStruck-Regular.otf
│ │ │ │ ├── STIXMathJax_Fraktur-Bold.otf
│ │ │ │ ├── STIXMathJax_Fraktur-Regular.otf
│ │ │ │ ├── STIXMathJax_Latin-Bold.otf
│ │ │ │ ├── STIXMathJax_Latin-BoldItalic.otf
│ │ │ │ ├── STIXMathJax_Latin-Italic.otf
│ │ │ │ ├── STIXMathJax_Latin-Regular.otf
│ │ │ │ ├── STIXMathJax_Main-Bold.otf
│ │ │ │ ├── STIXMathJax_Main-BoldItalic.otf
│ │ │ │ ├── STIXMathJax_Main-Italic.otf
│ │ │ │ ├── STIXMathJax_Main-Regular.otf
│ │ │ │ ├── STIXMathJax_Marks-Bold.otf
│ │ │ │ ├── STIXMathJax_Marks-BoldItalic.otf
│ │ │ │ ├── STIXMathJax_Marks-Italic.otf
│ │ │ │ ├── STIXMathJax_Marks-Regular.otf
│ │ │ │ ├── STIXMathJax_Misc-Bold.otf
│ │ │ │ ├── STIXMathJax_Misc-BoldItalic.otf
│ │ │ │ ├── STIXMathJax_Misc-Italic.otf
│ │ │ │ ├── STIXMathJax_Misc-Regular.otf
│ │ │ │ ├── STIXMathJax_Monospace-Regular.otf
│ │ │ │ ├── STIXMathJax_Normal-Bold.otf
│ │ │ │ ├── STIXMathJax_Normal-BoldItalic.otf
│ │ │ │ ├── STIXMathJax_Normal-Italic.otf
│ │ │ │ ├── STIXMathJax_Operators-Bold.otf
│ │ │ │ ├── STIXMathJax_Operators-Regular.otf
│ │ │ │ ├── STIXMathJax_SansSerif-Bold.otf
│ │ │ │ ├── STIXMathJax_SansSerif-BoldItalic.otf
│ │ │ │ ├── STIXMathJax_SansSerif-Italic.otf
│ │ │ │ ├── STIXMathJax_SansSerif-Regular.otf
│ │ │ │ ├── STIXMathJax_Script-BoldItalic.otf
│ │ │ │ ├── STIXMathJax_Script-Italic.otf
│ │ │ │ ├── STIXMathJax_Script-Regular.otf
│ │ │ │ ├── STIXMathJax_Shapes-Bold.otf
│ │ │ │ ├── STIXMathJax_Shapes-BoldItalic.otf
│ │ │ │ ├── STIXMathJax_Shapes-Regular.otf
│ │ │ │ ├── STIXMathJax_Size1-Regular.otf
│ │ │ │ ├── STIXMathJax_Size2-Regular.otf
│ │ │ │ ├── STIXMathJax_Size3-Regular.otf
│ │ │ │ ├── STIXMathJax_Size4-Regular.otf
│ │ │ │ ├── STIXMathJax_Size5-Regular.otf
│ │ │ │ ├── STIXMathJax_Symbols-Bold.otf
│ │ │ │ ├── STIXMathJax_Symbols-Regular.otf
│ │ │ │ ├── STIXMathJax_Variants-Bold.otf
│ │ │ │ ├── STIXMathJax_Variants-BoldItalic.otf
│ │ │ │ ├── STIXMathJax_Variants-Italic.otf
│ │ │ │ └── STIXMathJax_Variants-Regular.otf
│ │ │ └── TeX/
│ │ │ └── otf/
│ │ │ ├── MathJax_AMS-Regular.otf
│ │ │ ├── MathJax_Caligraphic-Bold.otf
│ │ │ ├── MathJax_Caligraphic-Regular.otf
│ │ │ ├── MathJax_Fraktur-Bold.otf
│ │ │ ├── MathJax_Fraktur-Regular.otf
│ │ │ ├── MathJax_Main-Bold.otf
│ │ │ ├── MathJax_Main-Italic.otf
│ │ │ ├── MathJax_Main-Regular.otf
│ │ │ ├── MathJax_Math-BoldItalic.otf
│ │ │ ├── MathJax_Math-Italic.otf
│ │ │ ├── MathJax_Math-Regular.otf
│ │ │ ├── MathJax_SansSerif-Bold.otf
│ │ │ ├── MathJax_SansSerif-Italic.otf
│ │ │ ├── MathJax_SansSerif-Regular.otf
│ │ │ ├── MathJax_Script-Regular.otf
│ │ │ ├── MathJax_Size1-Regular.otf
│ │ │ ├── MathJax_Size2-Regular.otf
│ │ │ ├── MathJax_Size3-Regular.otf
│ │ │ ├── MathJax_Size4-Regular.otf
│ │ │ ├── MathJax_Typewriter-Regular.otf
│ │ │ ├── MathJax_Vector-Bold.otf
│ │ │ ├── MathJax_Vector-Regular.otf
│ │ │ ├── MathJax_WinChrome-Regular.otf
│ │ │ └── MathJax_WinIE6-Regular.otf
│ │ ├── jax/
│ │ │ ├── element/
│ │ │ │ └── mml/
│ │ │ │ ├── jax.js
│ │ │ │ └── optable/
│ │ │ │ ├── Arrows.js
│ │ │ │ ├── BasicLatin.js
│ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ ├── CombDiactForSymbols.js
│ │ │ │ ├── Dingbats.js
│ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ ├── GeometricShapes.js
│ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ ├── Latin1Supplement.js
│ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ ├── MathOperators.js
│ │ │ │ ├── MiscMathSymbolsA.js
│ │ │ │ ├── MiscMathSymbolsB.js
│ │ │ │ ├── MiscSymbolsAndArrows.js
│ │ │ │ ├── MiscTechnical.js
│ │ │ │ ├── SpacingModLetters.js
│ │ │ │ ├── SuppMathOperators.js
│ │ │ │ ├── SupplementalArrowsA.js
│ │ │ │ └── SupplementalArrowsB.js
│ │ │ ├── input/
│ │ │ │ ├── AsciiMath/
│ │ │ │ │ ├── config.js
│ │ │ │ │ └── jax.js
│ │ │ │ ├── MathML/
│ │ │ │ │ ├── config.js
│ │ │ │ │ ├── entities/
│ │ │ │ │ │ ├── a.js
│ │ │ │ │ │ ├── b.js
│ │ │ │ │ │ ├── c.js
│ │ │ │ │ │ ├── d.js
│ │ │ │ │ │ ├── e.js
│ │ │ │ │ │ ├── f.js
│ │ │ │ │ │ ├── fr.js
│ │ │ │ │ │ ├── g.js
│ │ │ │ │ │ ├── h.js
│ │ │ │ │ │ ├── i.js
│ │ │ │ │ │ ├── j.js
│ │ │ │ │ │ ├── k.js
│ │ │ │ │ │ ├── l.js
│ │ │ │ │ │ ├── m.js
│ │ │ │ │ │ ├── n.js
│ │ │ │ │ │ ├── o.js
│ │ │ │ │ │ ├── opf.js
│ │ │ │ │ │ ├── p.js
│ │ │ │ │ │ ├── q.js
│ │ │ │ │ │ ├── r.js
│ │ │ │ │ │ ├── s.js
│ │ │ │ │ │ ├── scr.js
│ │ │ │ │ │ ├── t.js
│ │ │ │ │ │ ├── u.js
│ │ │ │ │ │ ├── v.js
│ │ │ │ │ │ ├── w.js
│ │ │ │ │ │ ├── x.js
│ │ │ │ │ │ ├── y.js
│ │ │ │ │ │ └── z.js
│ │ │ │ │ └── jax.js
│ │ │ │ └── TeX/
│ │ │ │ ├── config.js
│ │ │ │ └── jax.js
│ │ │ └── output/
│ │ │ ├── CommonHTML/
│ │ │ │ ├── autoload/
│ │ │ │ │ ├── annotation-xml.js
│ │ │ │ │ ├── maction.js
│ │ │ │ │ ├── menclose.js
│ │ │ │ │ ├── mglyph.js
│ │ │ │ │ ├── mmultiscripts.js
│ │ │ │ │ ├── ms.js
│ │ │ │ │ ├── mtable.js
│ │ │ │ │ └── multiline.js
│ │ │ │ ├── config.js
│ │ │ │ ├── fonts/
│ │ │ │ │ └── TeX/
│ │ │ │ │ ├── AMS-Regular.js
│ │ │ │ │ ├── Caligraphic-Bold.js
│ │ │ │ │ ├── Fraktur-Bold.js
│ │ │ │ │ ├── Fraktur-Regular.js
│ │ │ │ │ ├── Main-Bold.js
│ │ │ │ │ ├── Math-BoldItalic.js
│ │ │ │ │ ├── SansSerif-Bold.js
│ │ │ │ │ ├── SansSerif-Italic.js
│ │ │ │ │ ├── SansSerif-Regular.js
│ │ │ │ │ ├── Script-Regular.js
│ │ │ │ │ ├── Typewriter-Regular.js
│ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ └── fontdata.js
│ │ │ │ └── jax.js
│ │ │ ├── HTML-CSS/
│ │ │ │ ├── autoload/
│ │ │ │ │ ├── annotation-xml.js
│ │ │ │ │ ├── maction.js
│ │ │ │ │ ├── menclose.js
│ │ │ │ │ ├── mglyph.js
│ │ │ │ │ ├── mmultiscripts.js
│ │ │ │ │ ├── ms.js
│ │ │ │ │ ├── mtable.js
│ │ │ │ │ └── multiline.js
│ │ │ │ ├── config.js
│ │ │ │ ├── fonts/
│ │ │ │ │ ├── Asana-Math/
│ │ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Latin/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Main/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Marks/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Misc/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Normal/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Operators/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Script/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size1/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size2/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size3/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size4/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size5/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size6/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Variants/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ │ └── fontdata.js
│ │ │ │ │ ├── Gyre-Pagella/
│ │ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Latin/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Main/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Marks/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Misc/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Normal/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Operators/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Script/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size1/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size2/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size3/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size4/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size5/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size6/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Variants/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ │ └── fontdata.js
│ │ │ │ │ ├── Gyre-Termes/
│ │ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Latin/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Main/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Marks/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Misc/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Normal/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Operators/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Script/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size1/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size2/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size3/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size4/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size5/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size6/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Variants/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ │ └── fontdata.js
│ │ │ │ │ ├── Latin-Modern/
│ │ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Latin/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Main/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Marks/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Misc/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Normal/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Operators/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Script/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size1/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size2/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size3/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size4/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size5/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size6/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size7/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Variants/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ │ └── fontdata.js
│ │ │ │ │ ├── Neo-Euler/
│ │ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Main/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Marks/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Normal/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Operators/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Script/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size1/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size2/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size3/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size4/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size5/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Variants/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ │ └── fontdata.js
│ │ │ │ │ ├── STIX/
│ │ │ │ │ │ ├── General/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ ├── AlphaPresentForms.js
│ │ │ │ │ │ │ │ ├── Arrows.js
│ │ │ │ │ │ │ │ ├── BBBold.js
│ │ │ │ │ │ │ │ ├── BoldFraktur.js
│ │ │ │ │ │ │ │ ├── BoxDrawing.js
│ │ │ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ │ │ ├── CombDiactForSymbols.js
│ │ │ │ │ │ │ │ ├── ControlPictures.js
│ │ │ │ │ │ │ │ ├── CurrencySymbols.js
│ │ │ │ │ │ │ │ ├── Cyrillic.js
│ │ │ │ │ │ │ │ ├── EnclosedAlphanum.js
│ │ │ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ │ │ ├── GeometricShapes.js
│ │ │ │ │ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ │ │ │ │ ├── GreekBold.js
│ │ │ │ │ │ │ │ ├── GreekSSBold.js
│ │ │ │ │ │ │ │ ├── IPAExtensions.js
│ │ │ │ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ │ │ │ ├── LatinExtendedAdditional.js
│ │ │ │ │ │ │ │ ├── LatinExtendedB.js
│ │ │ │ │ │ │ │ ├── LatinExtendedD.js
│ │ │ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ │ ├── MathBold.js
│ │ │ │ │ │ │ │ ├── MathOperators.js
│ │ │ │ │ │ │ │ ├── MathSSBold.js
│ │ │ │ │ │ │ │ ├── MiscMathSymbolsA.js
│ │ │ │ │ │ │ │ ├── MiscMathSymbolsB.js
│ │ │ │ │ │ │ │ ├── MiscSymbols.js
│ │ │ │ │ │ │ │ ├── MiscTechnical.js
│ │ │ │ │ │ │ │ ├── NumberForms.js
│ │ │ │ │ │ │ │ ├── PhoneticExtensions.js
│ │ │ │ │ │ │ │ ├── SpacingModLetters.js
│ │ │ │ │ │ │ │ ├── SuperAndSubscripts.js
│ │ │ │ │ │ │ │ └── SuppMathOperators.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ ├── AlphaPresentForms.js
│ │ │ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ │ │ ├── BoxDrawing.js
│ │ │ │ │ │ │ │ ├── CombDiactForSymbols.js
│ │ │ │ │ │ │ │ ├── ControlPictures.js
│ │ │ │ │ │ │ │ ├── CurrencySymbols.js
│ │ │ │ │ │ │ │ ├── Cyrillic.js
│ │ │ │ │ │ │ │ ├── EnclosedAlphanum.js
│ │ │ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ │ │ │ │ ├── GreekBoldItalic.js
│ │ │ │ │ │ │ │ ├── GreekSSBoldItalic.js
│ │ │ │ │ │ │ │ ├── IPAExtensions.js
│ │ │ │ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ │ │ │ ├── LatinExtendedAdditional.js
│ │ │ │ │ │ │ │ ├── LatinExtendedB.js
│ │ │ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ │ ├── MathBoldItalic.js
│ │ │ │ │ │ │ │ ├── MathBoldScript.js
│ │ │ │ │ │ │ │ ├── MathOperators.js
│ │ │ │ │ │ │ │ ├── MathSSItalicBold.js
│ │ │ │ │ │ │ │ └── SpacingModLetters.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ ├── AlphaPresentForms.js
│ │ │ │ │ │ │ │ ├── BoxDrawing.js
│ │ │ │ │ │ │ │ ├── CombDiactForSymbols.js
│ │ │ │ │ │ │ │ ├── ControlPictures.js
│ │ │ │ │ │ │ │ ├── CurrencySymbols.js
│ │ │ │ │ │ │ │ ├── Cyrillic.js
│ │ │ │ │ │ │ │ ├── EnclosedAlphanum.js
│ │ │ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ │ │ │ │ ├── GreekItalic.js
│ │ │ │ │ │ │ │ ├── IPAExtensions.js
│ │ │ │ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ │ │ │ ├── LatinExtendedAdditional.js
│ │ │ │ │ │ │ │ ├── LatinExtendedB.js
│ │ │ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ │ ├── MathItalic.js
│ │ │ │ │ │ │ │ ├── MathOperators.js
│ │ │ │ │ │ │ │ ├── MathSSItalic.js
│ │ │ │ │ │ │ │ ├── MathScript.js
│ │ │ │ │ │ │ │ ├── SpacingModLetters.js
│ │ │ │ │ │ │ │ └── ij.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── AlphaPresentForms.js
│ │ │ │ │ │ │ ├── Arrows.js
│ │ │ │ │ │ │ ├── BBBold.js
│ │ │ │ │ │ │ ├── BlockElements.js
│ │ │ │ │ │ │ ├── BoldFraktur.js
│ │ │ │ │ │ │ ├── BoxDrawing.js
│ │ │ │ │ │ │ ├── CJK.js
│ │ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ │ ├── CombDiactForSymbols.js
│ │ │ │ │ │ │ ├── ControlPictures.js
│ │ │ │ │ │ │ ├── CurrencySymbols.js
│ │ │ │ │ │ │ ├── Cyrillic.js
│ │ │ │ │ │ │ ├── Dingbats.js
│ │ │ │ │ │ │ ├── EnclosedAlphanum.js
│ │ │ │ │ │ │ ├── Fraktur.js
│ │ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ │ ├── GeometricShapes.js
│ │ │ │ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ │ │ │ ├── GreekBold.js
│ │ │ │ │ │ │ ├── GreekBoldItalic.js
│ │ │ │ │ │ │ ├── GreekItalic.js
│ │ │ │ │ │ │ ├── GreekSSBold.js
│ │ │ │ │ │ │ ├── GreekSSBoldItalic.js
│ │ │ │ │ │ │ ├── Hiragana.js
│ │ │ │ │ │ │ ├── IPAExtensions.js
│ │ │ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ │ │ ├── LatinExtendedAdditional.js
│ │ │ │ │ │ │ ├── LatinExtendedB.js
│ │ │ │ │ │ │ ├── LatinExtendedD.js
│ │ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ ├── MathBold.js
│ │ │ │ │ │ │ ├── MathBoldItalic.js
│ │ │ │ │ │ │ ├── MathBoldScript.js
│ │ │ │ │ │ │ ├── MathItalic.js
│ │ │ │ │ │ │ ├── MathOperators.js
│ │ │ │ │ │ │ ├── MathSS.js
│ │ │ │ │ │ │ ├── MathSSBold.js
│ │ │ │ │ │ │ ├── MathSSItalic.js
│ │ │ │ │ │ │ ├── MathSSItalicBold.js
│ │ │ │ │ │ │ ├── MathScript.js
│ │ │ │ │ │ │ ├── MathTT.js
│ │ │ │ │ │ │ ├── MiscMathSymbolsA.js
│ │ │ │ │ │ │ ├── MiscMathSymbolsB.js
│ │ │ │ │ │ │ ├── MiscSymbols.js
│ │ │ │ │ │ │ ├── MiscSymbolsAndArrows.js
│ │ │ │ │ │ │ ├── MiscTechnical.js
│ │ │ │ │ │ │ ├── NumberForms.js
│ │ │ │ │ │ │ ├── PhoneticExtensions.js
│ │ │ │ │ │ │ ├── SpacingModLetters.js
│ │ │ │ │ │ │ ├── Specials.js
│ │ │ │ │ │ │ ├── SuperAndSubscripts.js
│ │ │ │ │ │ │ ├── SuppMathOperators.js
│ │ │ │ │ │ │ ├── SupplementalArrowsA.js
│ │ │ │ │ │ │ ├── SupplementalArrowsB.js
│ │ │ │ │ │ │ └── ij.js
│ │ │ │ │ │ ├── IntegralsD/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── All.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── IntegralsSm/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── All.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── IntegralsUp/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── All.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── IntegralsUpD/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── All.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── IntegralsUpSm/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── All.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ │ └── PrivateUse.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ │ └── PrivateUse.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ │ └── PrivateUse.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ └── PrivateUse.js
│ │ │ │ │ │ ├── SizeFiveSym/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SizeFourSym/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SizeOneSym/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SizeThreeSym/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SizeTwoSym/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Variants/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── fontdata-1.0.js
│ │ │ │ │ │ ├── fontdata-beta.js
│ │ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ │ └── fontdata.js
│ │ │ │ │ ├── STIX-Web/
│ │ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Latin/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Main/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Marks/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Misc/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Normal/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Operators/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Script/
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size1/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size2/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size3/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size4/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size5/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Variants/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ │ └── fontdata.js
│ │ │ │ │ └── TeX/
│ │ │ │ │ ├── AMS/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ ├── Arrows.js
│ │ │ │ │ │ ├── BBBold.js
│ │ │ │ │ │ ├── BoxDrawing.js
│ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ ├── Dingbats.js
│ │ │ │ │ │ ├── EnclosedAlphanum.js
│ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ ├── GeometricShapes.js
│ │ │ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ ├── MathOperators.js
│ │ │ │ │ │ ├── MiscMathSymbolsB.js
│ │ │ │ │ │ ├── MiscSymbols.js
│ │ │ │ │ │ ├── MiscTechnical.js
│ │ │ │ │ │ ├── PUA.js
│ │ │ │ │ │ ├── SpacingModLetters.js
│ │ │ │ │ │ └── SuppMathOperators.js
│ │ │ │ │ ├── Caligraphic/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ ├── Other.js
│ │ │ │ │ │ │ └── PUA.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ ├── Other.js
│ │ │ │ │ │ └── PUA.js
│ │ │ │ │ ├── Greek/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Main/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ ├── Arrows.js
│ │ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ │ ├── CombDiactForSymbols.js
│ │ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ │ ├── GeometricShapes.js
│ │ │ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ │ │ ├── LatinExtendedB.js
│ │ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ ├── MathOperators.js
│ │ │ │ │ │ │ ├── MiscMathSymbolsA.js
│ │ │ │ │ │ │ ├── MiscSymbols.js
│ │ │ │ │ │ │ ├── MiscTechnical.js
│ │ │ │ │ │ │ ├── SpacingModLetters.js
│ │ │ │ │ │ │ ├── SuppMathOperators.js
│ │ │ │ │ │ │ └── SupplementalArrowsA.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ ├── GeometricShapes.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ ├── MiscSymbols.js
│ │ │ │ │ │ └── SpacingModLetters.js
│ │ │ │ │ ├── Math/
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Italic/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ └── Other.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ └── Other.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ └── Other.js
│ │ │ │ │ ├── Script/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ └── Other.js
│ │ │ │ │ ├── Size1/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size2/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size3/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size4/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Typewriter/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ └── Other.js
│ │ │ │ │ ├── WinChrome/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── WinIE6/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ ├── AMS.js
│ │ │ │ │ │ ├── Bold.js
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ └── fontdata.js
│ │ │ │ ├── imageFonts.js
│ │ │ │ └── jax.js
│ │ │ ├── NativeMML/
│ │ │ │ ├── config.js
│ │ │ │ └── jax.js
│ │ │ ├── PlainSource/
│ │ │ │ ├── config.js
│ │ │ │ └── jax.js
│ │ │ ├── PreviewHTML/
│ │ │ │ ├── config.js
│ │ │ │ └── jax.js
│ │ │ └── SVG/
│ │ │ ├── autoload/
│ │ │ │ ├── annotation-xml.js
│ │ │ │ ├── maction.js
│ │ │ │ ├── menclose.js
│ │ │ │ ├── mglyph.js
│ │ │ │ ├── mmultiscripts.js
│ │ │ │ ├── ms.js
│ │ │ │ ├── mtable.js
│ │ │ │ └── multiline.js
│ │ │ ├── config.js
│ │ │ ├── fonts/
│ │ │ │ ├── Asana-Math/
│ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Latin/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Main/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Marks/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Misc/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Normal/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Operators/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Script/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size1/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size2/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size3/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size4/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size5/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size6/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Variants/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ └── fontdata.js
│ │ │ │ ├── Gyre-Pagella/
│ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Latin/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Main/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Marks/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Misc/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Normal/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Operators/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Script/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size1/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size2/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size3/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size4/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size5/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size6/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Variants/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ └── fontdata.js
│ │ │ │ ├── Gyre-Termes/
│ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Latin/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Main/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Marks/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Misc/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Normal/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Operators/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Script/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size1/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size2/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size3/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size4/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size5/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size6/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Variants/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ └── fontdata.js
│ │ │ │ ├── Latin-Modern/
│ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Latin/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Main/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Marks/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Misc/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Normal/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Operators/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Script/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size1/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size2/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size3/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size4/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size5/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size6/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size7/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Variants/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ └── fontdata.js
│ │ │ │ ├── Neo-Euler/
│ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Main/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Marks/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Normal/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Operators/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Script/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size1/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size2/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size3/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size4/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size5/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Variants/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ └── fontdata.js
│ │ │ │ ├── STIX-Web/
│ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Latin/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Main/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Marks/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Misc/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Normal/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Italic/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Operators/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Script/
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size1/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size2/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size3/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size4/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size5/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Variants/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ └── fontdata.js
│ │ │ │ └── TeX/
│ │ │ │ ├── AMS/
│ │ │ │ │ └── Regular/
│ │ │ │ │ ├── Arrows.js
│ │ │ │ │ ├── BoxDrawing.js
│ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ ├── Dingbats.js
│ │ │ │ │ ├── EnclosedAlphanum.js
│ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ ├── GeometricShapes.js
│ │ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ ├── Main.js
│ │ │ │ │ ├── MathOperators.js
│ │ │ │ │ ├── MiscMathSymbolsB.js
│ │ │ │ │ ├── MiscSymbols.js
│ │ │ │ │ ├── MiscTechnical.js
│ │ │ │ │ ├── PUA.js
│ │ │ │ │ ├── SpacingModLetters.js
│ │ │ │ │ └── SuppMathOperators.js
│ │ │ │ ├── Caligraphic/
│ │ │ │ │ ├── Bold/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ └── Regular/
│ │ │ │ │ └── Main.js
│ │ │ │ ├── Fraktur/
│ │ │ │ │ ├── Bold/
│ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ ├── Other.js
│ │ │ │ │ │ └── PUA.js
│ │ │ │ │ └── Regular/
│ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ ├── Main.js
│ │ │ │ │ ├── Other.js
│ │ │ │ │ └── PUA.js
│ │ │ │ ├── Main/
│ │ │ │ │ ├── Bold/
│ │ │ │ │ │ ├── Arrows.js
│ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ ├── CombDiactForSymbols.js
│ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ ├── GeometricShapes.js
│ │ │ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ │ ├── LatinExtendedB.js
│ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ ├── MathOperators.js
│ │ │ │ │ │ ├── MiscMathSymbolsA.js
│ │ │ │ │ │ ├── MiscSymbols.js
│ │ │ │ │ │ ├── MiscTechnical.js
│ │ │ │ │ │ ├── SpacingModLetters.js
│ │ │ │ │ │ ├── SuppMathOperators.js
│ │ │ │ │ │ └── SupplementalArrowsA.js
│ │ │ │ │ ├── Italic/
│ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ │ ├── LatinExtendedB.js
│ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ └── MathOperators.js
│ │ │ │ │ └── Regular/
│ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ ├── GeometricShapes.js
│ │ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ ├── LatinExtendedB.js
│ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ ├── Main.js
│ │ │ │ │ ├── MathOperators.js
│ │ │ │ │ ├── MiscSymbols.js
│ │ │ │ │ ├── SpacingModLetters.js
│ │ │ │ │ └── SuppMathOperators.js
│ │ │ │ ├── Math/
│ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ └── Italic/
│ │ │ │ │ └── Main.js
│ │ │ │ ├── SansSerif/
│ │ │ │ │ ├── Bold/
│ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ └── Other.js
│ │ │ │ │ ├── Italic/
│ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ └── Other.js
│ │ │ │ │ └── Regular/
│ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ ├── Main.js
│ │ │ │ │ └── Other.js
│ │ │ │ ├── Script/
│ │ │ │ │ └── Regular/
│ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ └── Main.js
│ │ │ │ ├── Size1/
│ │ │ │ │ └── Regular/
│ │ │ │ │ └── Main.js
│ │ │ │ ├── Size2/
│ │ │ │ │ └── Regular/
│ │ │ │ │ └── Main.js
│ │ │ │ ├── Size3/
│ │ │ │ │ └── Regular/
│ │ │ │ │ └── Main.js
│ │ │ │ ├── Size4/
│ │ │ │ │ └── Regular/
│ │ │ │ │ └── Main.js
│ │ │ │ ├── Typewriter/
│ │ │ │ │ └── Regular/
│ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ ├── Main.js
│ │ │ │ │ └── Other.js
│ │ │ │ ├── fontdata-extra.js
│ │ │ │ └── fontdata.js
│ │ │ └── jax.js
│ │ ├── latest.js
│ │ ├── localization/
│ │ │ ├── ar/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── ar.js
│ │ │ ├── ast/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── ast.js
│ │ │ ├── bcc/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── bcc.js
│ │ │ ├── bg/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── bg.js
│ │ │ ├── br/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── br.js
│ │ │ ├── ca/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── ca.js
│ │ │ ├── cdo/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── cdo.js
│ │ │ ├── ce/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── ce.js
│ │ │ ├── cs/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── cs.js
│ │ │ ├── cy/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── cy.js
│ │ │ ├── da/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── da.js
│ │ │ ├── de/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── de.js
│ │ │ ├── diq/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── diq.js
│ │ │ ├── en/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── en.js
│ │ │ ├── eo/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── eo.js
│ │ │ ├── es/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── es.js
│ │ │ ├── fa/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── fa.js
│ │ │ ├── fi/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── fi.js
│ │ │ ├── fr/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── fr.js
│ │ │ ├── gl/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── gl.js
│ │ │ ├── he/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── he.js
│ │ │ ├── ia/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── ia.js
│ │ │ ├── it/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── it.js
│ │ │ ├── ja/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── ja.js
│ │ │ ├── kn/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── kn.js
│ │ │ ├── ko/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── ko.js
│ │ │ ├── lb/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── lb.js
│ │ │ ├── lki/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── lki.js
│ │ │ ├── lt/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── lt.js
│ │ │ ├── mk/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── mk.js
│ │ │ ├── nl/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── nl.js
│ │ │ ├── oc/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── oc.js
│ │ │ ├── pl/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── pl.js
│ │ │ ├── pt/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── pt.js
│ │ │ ├── pt-br/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── pt-br.js
│ │ │ ├── qqq/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── qqq.js
│ │ │ ├── ru/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── ru.js
│ │ │ ├── scn/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── scn.js
│ │ │ ├── sco/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── sco.js
│ │ │ ├── sk/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── sk.js
│ │ │ ├── sl/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── sl.js
│ │ │ ├── sv/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── sv.js
│ │ │ ├── th/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── th.js
│ │ │ ├── tr/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── tr.js
│ │ │ ├── uk/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── uk.js
│ │ │ ├── vi/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── vi.js
│ │ │ ├── zh-hans/
│ │ │ │ ├── FontWarnings.js
│ │ │ │ ├── HTML-CSS.js
│ │ │ │ ├── HelpDialog.js
│ │ │ │ ├── MathML.js
│ │ │ │ ├── MathMenu.js
│ │ │ │ ├── TeX.js
│ │ │ │ └── zh-hans.js
│ │ │ └── zh-hant/
│ │ │ ├── FontWarnings.js
│ │ │ ├── HTML-CSS.js
│ │ │ ├── HelpDialog.js
│ │ │ ├── MathML.js
│ │ │ ├── MathMenu.js
│ │ │ ├── TeX.js
│ │ │ └── zh-hant.js
│ │ ├── package.json
│ │ ├── test/
│ │ │ ├── examples.html
│ │ │ ├── index-images.html
│ │ │ ├── index.html
│ │ │ ├── localization.html
│ │ │ ├── sample-all-at-once.html
│ │ │ ├── sample-asciimath.html
│ │ │ ├── sample-autoload.html
│ │ │ ├── sample-dynamic-2.html
│ │ │ ├── sample-dynamic-steps.html
│ │ │ ├── sample-dynamic.html
│ │ │ ├── sample-eqnum.html
│ │ │ ├── sample-eqrefs.html
│ │ │ ├── sample-loader-config.html
│ │ │ ├── sample-loader.html
│ │ │ ├── sample-macros.html
│ │ │ ├── sample-mediawiki-texvc.html
│ │ │ ├── sample-mml.html
│ │ │ ├── sample-signals.html
│ │ │ ├── sample-tex.html
│ │ │ └── sample.html
│ │ └── unpacked/
│ │ ├── MathJax.js
│ │ ├── config/
│ │ │ ├── AM_CHTML-full.js
│ │ │ ├── AM_CHTML.js
│ │ │ ├── AM_HTMLorMML-full.js
│ │ │ ├── AM_HTMLorMML.js
│ │ │ ├── AM_SVG-full.js
│ │ │ ├── AM_SVG.js
│ │ │ ├── Accessible-full.js
│ │ │ ├── Accessible.js
│ │ │ ├── MML_CHTML-full.js
│ │ │ ├── MML_CHTML.js
│ │ │ ├── MML_HTMLorMML-full.js
│ │ │ ├── MML_HTMLorMML.js
│ │ │ ├── MML_SVG-full.js
│ │ │ ├── MML_SVG.js
│ │ │ ├── MMLorHTML.js
│ │ │ ├── Safe.js
│ │ │ ├── TeX-AMS-MML_HTMLorMML-full.js
│ │ │ ├── TeX-AMS-MML_HTMLorMML.js
│ │ │ ├── TeX-AMS-MML_SVG-full.js
│ │ │ ├── TeX-AMS-MML_SVG.js
│ │ │ ├── TeX-AMS_CHTML-full.js
│ │ │ ├── TeX-AMS_CHTML.js
│ │ │ ├── TeX-AMS_HTML-full.js
│ │ │ ├── TeX-AMS_HTML.js
│ │ │ ├── TeX-AMS_SVG-full.js
│ │ │ ├── TeX-AMS_SVG.js
│ │ │ ├── TeX-MML-AM_CHTML-full.js
│ │ │ ├── TeX-MML-AM_CHTML.js
│ │ │ ├── TeX-MML-AM_HTMLorMML-full.js
│ │ │ ├── TeX-MML-AM_HTMLorMML.js
│ │ │ ├── TeX-MML-AM_SVG-full.js
│ │ │ ├── TeX-MML-AM_SVG.js
│ │ │ ├── default.js
│ │ │ └── local/
│ │ │ └── local.js
│ │ ├── extensions/
│ │ │ ├── AssistiveMML.js
│ │ │ ├── CHTML-preview.js
│ │ │ ├── FontWarnings.js
│ │ │ ├── HTML-CSS/
│ │ │ │ └── handle-floats.js
│ │ │ ├── HelpDialog.js
│ │ │ ├── MatchWebFonts.js
│ │ │ ├── MathEvents.js
│ │ │ ├── MathML/
│ │ │ │ ├── content-mathml.js
│ │ │ │ └── mml3.js
│ │ │ ├── MathMenu.js
│ │ │ ├── MathZoom.js
│ │ │ ├── Safe.js
│ │ │ ├── TeX/
│ │ │ │ ├── AMScd.js
│ │ │ │ ├── AMSmath.js
│ │ │ │ ├── AMSsymbols.js
│ │ │ │ ├── HTML.js
│ │ │ │ ├── action.js
│ │ │ │ ├── autobold.js
│ │ │ │ ├── autoload-all.js
│ │ │ │ ├── bbox.js
│ │ │ │ ├── begingroup.js
│ │ │ │ ├── boldsymbol.js
│ │ │ │ ├── cancel.js
│ │ │ │ ├── color.js
│ │ │ │ ├── enclose.js
│ │ │ │ ├── extpfeil.js
│ │ │ │ ├── mathchoice.js
│ │ │ │ ├── mediawiki-texvc.js
│ │ │ │ ├── mhchem.js
│ │ │ │ ├── mhchem3/
│ │ │ │ │ └── mhchem.js
│ │ │ │ ├── newcommand.js
│ │ │ │ ├── noErrors.js
│ │ │ │ ├── noUndefined.js
│ │ │ │ ├── unicode.js
│ │ │ │ └── verb.js
│ │ │ ├── a11y/
│ │ │ │ ├── accessibility-menu.js
│ │ │ │ ├── auto-collapse.js
│ │ │ │ ├── collapsible.js
│ │ │ │ ├── explorer.js
│ │ │ │ ├── invalid_keypress.ogg
│ │ │ │ ├── mathjax-sre.js
│ │ │ │ ├── mathmaps/
│ │ │ │ │ ├── .htaccess
│ │ │ │ │ ├── functions/
│ │ │ │ │ │ ├── algebra.js
│ │ │ │ │ │ ├── elementary.js
│ │ │ │ │ │ ├── hyperbolic.js
│ │ │ │ │ │ └── trigonometry.js
│ │ │ │ │ ├── mathmaps_ie.js
│ │ │ │ │ ├── symbols/
│ │ │ │ │ │ ├── greek-capital.js
│ │ │ │ │ │ ├── greek-mathfonts.js
│ │ │ │ │ │ ├── greek-scripts.js
│ │ │ │ │ │ ├── greek-small.js
│ │ │ │ │ │ ├── greek-symbols.js
│ │ │ │ │ │ ├── hebrew_letters.js
│ │ │ │ │ │ ├── latin-lower-double-accent.js
│ │ │ │ │ │ ├── latin-lower-normal.js
│ │ │ │ │ │ ├── latin-lower-phonetic.js
│ │ │ │ │ │ ├── latin-lower-single-accent.js
│ │ │ │ │ │ ├── latin-mathfonts.js
│ │ │ │ │ │ ├── latin-rest.js
│ │ │ │ │ │ ├── latin-upper-double-accent.js
│ │ │ │ │ │ ├── latin-upper-normal.js
│ │ │ │ │ │ ├── latin-upper-single-accent.js
│ │ │ │ │ │ ├── math_angles.js
│ │ │ │ │ │ ├── math_arrows.js
│ │ │ │ │ │ ├── math_characters.js
│ │ │ │ │ │ ├── math_delimiters.js
│ │ │ │ │ │ ├── math_digits.js
│ │ │ │ │ │ ├── math_geometry.js
│ │ │ │ │ │ ├── math_harpoons.js
│ │ │ │ │ │ ├── math_non_characters.js
│ │ │ │ │ │ ├── math_symbols.js
│ │ │ │ │ │ ├── math_whitespace.js
│ │ │ │ │ │ └── other_stars.js
│ │ │ │ │ └── units/
│ │ │ │ │ ├── energy.js
│ │ │ │ │ ├── length.js
│ │ │ │ │ ├── memory.js
│ │ │ │ │ ├── other.js
│ │ │ │ │ ├── speed.js
│ │ │ │ │ ├── temperature.js
│ │ │ │ │ ├── time.js
│ │ │ │ │ ├── volume.js
│ │ │ │ │ └── weight.js
│ │ │ │ ├── semantic-enrich.js
│ │ │ │ └── wgxpath.install.js
│ │ │ ├── asciimath2jax.js
│ │ │ ├── fast-preview.js
│ │ │ ├── jsMath2jax.js
│ │ │ ├── mml2jax.js
│ │ │ ├── tex2jax.js
│ │ │ └── toMathML.js
│ │ ├── jax/
│ │ │ ├── element/
│ │ │ │ └── mml/
│ │ │ │ ├── jax.js
│ │ │ │ └── optable/
│ │ │ │ ├── Arrows.js
│ │ │ │ ├── BasicLatin.js
│ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ ├── CombDiactForSymbols.js
│ │ │ │ ├── Dingbats.js
│ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ ├── GeometricShapes.js
│ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ ├── Latin1Supplement.js
│ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ ├── MathOperators.js
│ │ │ │ ├── MiscMathSymbolsA.js
│ │ │ │ ├── MiscMathSymbolsB.js
│ │ │ │ ├── MiscSymbolsAndArrows.js
│ │ │ │ ├── MiscTechnical.js
│ │ │ │ ├── SpacingModLetters.js
│ │ │ │ ├── SuppMathOperators.js
│ │ │ │ ├── SupplementalArrowsA.js
│ │ │ │ └── SupplementalArrowsB.js
│ │ │ ├── input/
│ │ │ │ ├── AsciiMath/
│ │ │ │ │ ├── config.js
│ │ │ │ │ └── jax.js
│ │ │ │ ├── MathML/
│ │ │ │ │ ├── config.js
│ │ │ │ │ ├── entities/
│ │ │ │ │ │ ├── a.js
│ │ │ │ │ │ ├── b.js
│ │ │ │ │ │ ├── c.js
│ │ │ │ │ │ ├── d.js
│ │ │ │ │ │ ├── e.js
│ │ │ │ │ │ ├── f.js
│ │ │ │ │ │ ├── fr.js
│ │ │ │ │ │ ├── g.js
│ │ │ │ │ │ ├── h.js
│ │ │ │ │ │ ├── i.js
│ │ │ │ │ │ ├── j.js
│ │ │ │ │ │ ├── k.js
│ │ │ │ │ │ ├── l.js
│ │ │ │ │ │ ├── m.js
│ │ │ │ │ │ ├── n.js
│ │ │ │ │ │ ├── o.js
│ │ │ │ │ │ ├── opf.js
│ │ │ │ │ │ ├── p.js
│ │ │ │ │ │ ├── q.js
│ │ │ │ │ │ ├── r.js
│ │ │ │ │ │ ├── s.js
│ │ │ │ │ │ ├── scr.js
│ │ │ │ │ │ ├── t.js
│ │ │ │ │ │ ├── u.js
│ │ │ │ │ │ ├── v.js
│ │ │ │ │ │ ├── w.js
│ │ │ │ │ │ ├── x.js
│ │ │ │ │ │ ├── y.js
│ │ │ │ │ │ └── z.js
│ │ │ │ │ └── jax.js
│ │ │ │ └── TeX/
│ │ │ │ ├── config.js
│ │ │ │ └── jax.js
│ │ │ └── output/
│ │ │ ├── CommonHTML/
│ │ │ │ ├── autoload/
│ │ │ │ │ ├── annotation-xml.js
│ │ │ │ │ ├── maction.js
│ │ │ │ │ ├── menclose.js
│ │ │ │ │ ├── mglyph.js
│ │ │ │ │ ├── mmultiscripts.js
│ │ │ │ │ ├── ms.js
│ │ │ │ │ ├── mtable.js
│ │ │ │ │ └── multiline.js
│ │ │ │ ├── config.js
│ │ │ │ ├── fonts/
│ │ │ │ │ └── TeX/
│ │ │ │ │ ├── AMS-Regular.js
│ │ │ │ │ ├── Caligraphic-Bold.js
│ │ │ │ │ ├── Fraktur-Bold.js
│ │ │ │ │ ├── Fraktur-Regular.js
│ │ │ │ │ ├── Main-Bold.js
│ │ │ │ │ ├── Math-BoldItalic.js
│ │ │ │ │ ├── SansSerif-Bold.js
│ │ │ │ │ ├── SansSerif-Italic.js
│ │ │ │ │ ├── SansSerif-Regular.js
│ │ │ │ │ ├── Script-Regular.js
│ │ │ │ │ ├── Typewriter-Regular.js
│ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ └── fontdata.js
│ │ │ │ └── jax.js
│ │ │ ├── HTML-CSS/
│ │ │ │ ├── autoload/
│ │ │ │ │ ├── annotation-xml.js
│ │ │ │ │ ├── maction.js
│ │ │ │ │ ├── menclose.js
│ │ │ │ │ ├── mglyph.js
│ │ │ │ │ ├── mmultiscripts.js
│ │ │ │ │ ├── ms.js
│ │ │ │ │ ├── mtable.js
│ │ │ │ │ └── multiline.js
│ │ │ │ ├── config.js
│ │ │ │ ├── fonts/
│ │ │ │ │ ├── Asana-Math/
│ │ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Latin/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Main/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Marks/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Misc/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Normal/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Operators/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Script/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size1/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size2/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size3/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size4/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size5/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size6/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Variants/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ │ └── fontdata.js
│ │ │ │ │ ├── Gyre-Pagella/
│ │ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Latin/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Main/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Marks/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Misc/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Normal/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Operators/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Script/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size1/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size2/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size3/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size4/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size5/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size6/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Variants/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ │ └── fontdata.js
│ │ │ │ │ ├── Gyre-Termes/
│ │ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Latin/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Main/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Marks/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Misc/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Normal/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Operators/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Script/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size1/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size2/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size3/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size4/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size5/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size6/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Variants/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ │ └── fontdata.js
│ │ │ │ │ ├── Latin-Modern/
│ │ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Latin/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Main/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Marks/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Misc/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Normal/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Operators/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Script/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size1/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size2/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size3/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size4/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size5/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size6/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size7/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Variants/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ │ └── fontdata.js
│ │ │ │ │ ├── Neo-Euler/
│ │ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Main/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Marks/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Normal/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Operators/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Script/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size1/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size2/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size3/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size4/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size5/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Variants/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ │ └── fontdata.js
│ │ │ │ │ ├── STIX/
│ │ │ │ │ │ ├── General/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ ├── AlphaPresentForms.js
│ │ │ │ │ │ │ │ ├── Arrows.js
│ │ │ │ │ │ │ │ ├── BBBold.js
│ │ │ │ │ │ │ │ ├── BoldFraktur.js
│ │ │ │ │ │ │ │ ├── BoxDrawing.js
│ │ │ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ │ │ ├── CombDiactForSymbols.js
│ │ │ │ │ │ │ │ ├── ControlPictures.js
│ │ │ │ │ │ │ │ ├── CurrencySymbols.js
│ │ │ │ │ │ │ │ ├── Cyrillic.js
│ │ │ │ │ │ │ │ ├── EnclosedAlphanum.js
│ │ │ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ │ │ ├── GeometricShapes.js
│ │ │ │ │ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ │ │ │ │ ├── GreekBold.js
│ │ │ │ │ │ │ │ ├── GreekSSBold.js
│ │ │ │ │ │ │ │ ├── IPAExtensions.js
│ │ │ │ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ │ │ │ ├── LatinExtendedAdditional.js
│ │ │ │ │ │ │ │ ├── LatinExtendedB.js
│ │ │ │ │ │ │ │ ├── LatinExtendedD.js
│ │ │ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ │ ├── MathBold.js
│ │ │ │ │ │ │ │ ├── MathOperators.js
│ │ │ │ │ │ │ │ ├── MathSSBold.js
│ │ │ │ │ │ │ │ ├── MiscMathSymbolsA.js
│ │ │ │ │ │ │ │ ├── MiscMathSymbolsB.js
│ │ │ │ │ │ │ │ ├── MiscSymbols.js
│ │ │ │ │ │ │ │ ├── MiscTechnical.js
│ │ │ │ │ │ │ │ ├── NumberForms.js
│ │ │ │ │ │ │ │ ├── PhoneticExtensions.js
│ │ │ │ │ │ │ │ ├── SpacingModLetters.js
│ │ │ │ │ │ │ │ ├── SuperAndSubscripts.js
│ │ │ │ │ │ │ │ └── SuppMathOperators.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ ├── AlphaPresentForms.js
│ │ │ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ │ │ ├── BoxDrawing.js
│ │ │ │ │ │ │ │ ├── CombDiactForSymbols.js
│ │ │ │ │ │ │ │ ├── ControlPictures.js
│ │ │ │ │ │ │ │ ├── CurrencySymbols.js
│ │ │ │ │ │ │ │ ├── Cyrillic.js
│ │ │ │ │ │ │ │ ├── EnclosedAlphanum.js
│ │ │ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ │ │ │ │ ├── GreekBoldItalic.js
│ │ │ │ │ │ │ │ ├── GreekSSBoldItalic.js
│ │ │ │ │ │ │ │ ├── IPAExtensions.js
│ │ │ │ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ │ │ │ ├── LatinExtendedAdditional.js
│ │ │ │ │ │ │ │ ├── LatinExtendedB.js
│ │ │ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ │ ├── MathBoldItalic.js
│ │ │ │ │ │ │ │ ├── MathBoldScript.js
│ │ │ │ │ │ │ │ ├── MathOperators.js
│ │ │ │ │ │ │ │ ├── MathSSItalicBold.js
│ │ │ │ │ │ │ │ └── SpacingModLetters.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ ├── AlphaPresentForms.js
│ │ │ │ │ │ │ │ ├── BoxDrawing.js
│ │ │ │ │ │ │ │ ├── CombDiactForSymbols.js
│ │ │ │ │ │ │ │ ├── ControlPictures.js
│ │ │ │ │ │ │ │ ├── CurrencySymbols.js
│ │ │ │ │ │ │ │ ├── Cyrillic.js
│ │ │ │ │ │ │ │ ├── EnclosedAlphanum.js
│ │ │ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ │ │ │ │ ├── GreekItalic.js
│ │ │ │ │ │ │ │ ├── IPAExtensions.js
│ │ │ │ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ │ │ │ ├── LatinExtendedAdditional.js
│ │ │ │ │ │ │ │ ├── LatinExtendedB.js
│ │ │ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ │ ├── MathItalic.js
│ │ │ │ │ │ │ │ ├── MathOperators.js
│ │ │ │ │ │ │ │ ├── MathSSItalic.js
│ │ │ │ │ │ │ │ ├── MathScript.js
│ │ │ │ │ │ │ │ ├── SpacingModLetters.js
│ │ │ │ │ │ │ │ └── ij.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── AlphaPresentForms.js
│ │ │ │ │ │ │ ├── Arrows.js
│ │ │ │ │ │ │ ├── BBBold.js
│ │ │ │ │ │ │ ├── BlockElements.js
│ │ │ │ │ │ │ ├── BoldFraktur.js
│ │ │ │ │ │ │ ├── BoxDrawing.js
│ │ │ │ │ │ │ ├── CJK.js
│ │ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ │ ├── CombDiactForSymbols.js
│ │ │ │ │ │ │ ├── ControlPictures.js
│ │ │ │ │ │ │ ├── CurrencySymbols.js
│ │ │ │ │ │ │ ├── Cyrillic.js
│ │ │ │ │ │ │ ├── Dingbats.js
│ │ │ │ │ │ │ ├── EnclosedAlphanum.js
│ │ │ │ │ │ │ ├── Fraktur.js
│ │ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ │ ├── GeometricShapes.js
│ │ │ │ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ │ │ │ ├── GreekBold.js
│ │ │ │ │ │ │ ├── GreekBoldItalic.js
│ │ │ │ │ │ │ ├── GreekItalic.js
│ │ │ │ │ │ │ ├── GreekSSBold.js
│ │ │ │ │ │ │ ├── GreekSSBoldItalic.js
│ │ │ │ │ │ │ ├── Hiragana.js
│ │ │ │ │ │ │ ├── IPAExtensions.js
│ │ │ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ │ │ ├── LatinExtendedAdditional.js
│ │ │ │ │ │ │ ├── LatinExtendedB.js
│ │ │ │ │ │ │ ├── LatinExtendedD.js
│ │ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ ├── MathBold.js
│ │ │ │ │ │ │ ├── MathBoldItalic.js
│ │ │ │ │ │ │ ├── MathBoldScript.js
│ │ │ │ │ │ │ ├── MathItalic.js
│ │ │ │ │ │ │ ├── MathOperators.js
│ │ │ │ │ │ │ ├── MathSS.js
│ │ │ │ │ │ │ ├── MathSSBold.js
│ │ │ │ │ │ │ ├── MathSSItalic.js
│ │ │ │ │ │ │ ├── MathSSItalicBold.js
│ │ │ │ │ │ │ ├── MathScript.js
│ │ │ │ │ │ │ ├── MathTT.js
│ │ │ │ │ │ │ ├── MiscMathSymbolsA.js
│ │ │ │ │ │ │ ├── MiscMathSymbolsB.js
│ │ │ │ │ │ │ ├── MiscSymbols.js
│ │ │ │ │ │ │ ├── MiscSymbolsAndArrows.js
│ │ │ │ │ │ │ ├── MiscTechnical.js
│ │ │ │ │ │ │ ├── NumberForms.js
│ │ │ │ │ │ │ ├── PhoneticExtensions.js
│ │ │ │ │ │ │ ├── SpacingModLetters.js
│ │ │ │ │ │ │ ├── Specials.js
│ │ │ │ │ │ │ ├── SuperAndSubscripts.js
│ │ │ │ │ │ │ ├── SuppMathOperators.js
│ │ │ │ │ │ │ ├── SupplementalArrowsA.js
│ │ │ │ │ │ │ ├── SupplementalArrowsB.js
│ │ │ │ │ │ │ └── ij.js
│ │ │ │ │ │ ├── IntegralsD/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── All.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── IntegralsSm/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── All.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── IntegralsUp/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── All.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── IntegralsUpD/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── All.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── IntegralsUpSm/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── All.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ │ └── PrivateUse.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ │ └── PrivateUse.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ │ └── PrivateUse.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ └── PrivateUse.js
│ │ │ │ │ │ ├── SizeFiveSym/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SizeFourSym/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SizeOneSym/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SizeThreeSym/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SizeTwoSym/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Variants/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ ├── All.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── fontdata-1.0.js
│ │ │ │ │ │ ├── fontdata-beta.js
│ │ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ │ └── fontdata.js
│ │ │ │ │ ├── STIX-Web/
│ │ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Latin/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Main/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Marks/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Misc/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Normal/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Operators/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Script/
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size1/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size2/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size3/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size4/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Size5/
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Variants/
│ │ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ │ └── fontdata.js
│ │ │ │ │ └── TeX/
│ │ │ │ │ ├── AMS/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ ├── Arrows.js
│ │ │ │ │ │ ├── BBBold.js
│ │ │ │ │ │ ├── BoxDrawing.js
│ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ ├── Dingbats.js
│ │ │ │ │ │ ├── EnclosedAlphanum.js
│ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ ├── GeometricShapes.js
│ │ │ │ │ │ ├── GreekAndCoptic.js
│ │ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ ├── MathOperators.js
│ │ │ │ │ │ ├── MiscMathSymbolsB.js
│ │ │ │ │ │ ├── MiscSymbols.js
│ │ │ │ │ │ ├── MiscTechnical.js
│ │ │ │ │ │ ├── PUA.js
│ │ │ │ │ │ ├── SpacingModLetters.js
│ │ │ │ │ │ └── SuppMathOperators.js
│ │ │ │ │ ├── Caligraphic/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ ├── Other.js
│ │ │ │ │ │ │ └── PUA.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ ├── Other.js
│ │ │ │ │ │ └── PUA.js
│ │ │ │ │ ├── Greek/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Main/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ ├── Arrows.js
│ │ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ │ ├── CombDiactForSymbols.js
│ │ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ │ ├── GeometricShapes.js
│ │ │ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ │ │ ├── LatinExtendedA.js
│ │ │ │ │ │ │ ├── LatinExtendedB.js
│ │ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ ├── MathOperators.js
│ │ │ │ │ │ │ ├── MiscMathSymbolsA.js
│ │ │ │ │ │ │ ├── MiscSymbols.js
│ │ │ │ │ │ │ ├── MiscTechnical.js
│ │ │ │ │ │ │ ├── SpacingModLetters.js
│ │ │ │ │ │ │ ├── SuppMathOperators.js
│ │ │ │ │ │ │ └── SupplementalArrowsA.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ │ ├── GeneralPunctuation.js
│ │ │ │ │ │ │ ├── Latin1Supplement.js
│ │ │ │ │ │ │ ├── LetterlikeSymbols.js
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ ├── GeometricShapes.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ ├── MiscSymbols.js
│ │ │ │ │ │ └── SpacingModLetters.js
│ │ │ │ │ ├── Math/
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Italic/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ └── Other.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ │ └── Other.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ └── Other.js
│ │ │ │ │ ├── Script/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ └── Other.js
│ │ │ │ │ ├── Size1/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size2/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size3/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size4/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Typewriter/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ ├── BasicLatin.js
│ │ │ │ │ │ ├── CombDiacritMarks.js
│ │ │ │ │ │ ├── Main.js
│ │ │ │ │ │ └── Other.js
│ │ │ │ │ ├── WinChrome/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── WinIE6/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ ├── AMS.js
│ │ │ │ │ │ ├── Bold.js
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ └── fontdata.js
│ │ │ │ ├── imageFonts.js
│ │ │ │ └── jax.js
│ │ │ ├── NativeMML/
│ │ │ │ ├── config.js
│ │ │ │ └── jax.js
│ │ │ ├── PlainSource/
│ │ │ │ ├── config.js
│ │ │ │ └── jax.js
│ │ │ ├── PreviewHTML/
│ │ │ │ ├── config.js
│ │ │ │ └── jax.js
│ │ │ └── SVG/
│ │ │ ├── autoload/
│ │ │ │ ├── annotation-xml.js
│ │ │ │ ├── maction.js
│ │ │ │ ├── menclose.js
│ │ │ │ ├── mglyph.js
│ │ │ │ ├── mmultiscripts.js
│ │ │ │ ├── ms.js
│ │ │ │ ├── mtable.js
│ │ │ │ └── multiline.js
│ │ │ ├── config.js
│ │ │ ├── fonts/
│ │ │ │ ├── Asana-Math/
│ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Latin/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Main/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Marks/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Misc/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Normal/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Operators/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Script/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size1/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size2/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size3/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size4/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size5/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size6/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Variants/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ └── fontdata.js
│ │ │ │ ├── Gyre-Pagella/
│ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Latin/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Main/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Marks/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Misc/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Normal/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Operators/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Script/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size1/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size2/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size3/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size4/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size5/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size6/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Variants/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ └── fontdata.js
│ │ │ │ ├── Gyre-Termes/
│ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Latin/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Main/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Marks/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Misc/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Normal/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Operators/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Script/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size1/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size2/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size3/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size4/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size5/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size6/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Variants/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ └── fontdata.js
│ │ │ │ ├── Latin-Modern/
│ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Latin/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Main/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Marks/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Misc/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Monospace/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Normal/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Operators/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── SansSerif/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Script/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size1/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size2/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size3/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size4/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size5/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size6/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size7/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Variants/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ └── fontdata.js
│ │ │ │ ├── Neo-Euler/
│ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Main/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Marks/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── NonUnicode/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Normal/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Operators/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Script/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Shapes/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size1/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size2/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size3/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size4/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Size5/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Symbols/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Variants/
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── fontdata-extra.js
│ │ │ │ │ └── fontdata.js
│ │ │ │ ├── STIX-Web/
│ │ │ │ │ ├── Alphabets/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Arrows/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── DoubleStruck/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Fraktur/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Latin/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ └── Regular/
│ │ │ │ │ │ └── Main.js
│ │ │ │ │ ├── Main/
│ │ │ │ │ │ ├── Bold/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── BoldItalic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │ │ │ ├── Italic/
│ │ │ │ │ │ │ └── Main.js
│ │ │ │
================================================
FILE CONTENTS
================================================
================================================
FILE: .bazelignore
================================================
# The bazel example is an entirely separate bazel module and should
# not be built as part of the main library module.
examples/bazel
# The README instructions for building with CMake involve initialising the
# CMake build directory as a subdirectory called build, that directory
# ends up containing other bazel BUILD files, which then interfere with a
# bazel build. Therefore, exclude it.
build
================================================
FILE: .bazelversion
================================================
8.5.1
================================================
FILE: .clang-format
================================================
---
Language: Cpp
BasedOnStyle: Google
AccessModifierOffset: -1
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Left
AlignOperands: true
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: true
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: true
BinPackArguments: false
BinPackParameters: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: WebKit
BreakBeforeInheritanceComma: false
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakStringLiterals: true
ColumnLimit: 100
CommentPragmas: '^[*]* [@\\]'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: true
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
IncludeCategories:
- Regex: '^<.*\.h>'
Priority: 1
- Regex: '^<.*'
Priority: 2
- Regex: '.*'
Priority: 3
IncludeIsMainRegex: '([-_](test|unittest))?$'
IndentCaseLabels: true
IndentWidth: 4
IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
MacroBlockBegin: '^TRY$'
MacroBlockEnd: '^CATCH$'
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
PointerAlignment: Left
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Auto
TabWidth: 8
UseTab: Never
...
================================================
FILE: .gitattributes
================================================
* text=auto
*.py text
*.cpp text
*.c text
*.h text
*.jsonnet text
*.jinja text
*.html text
README text
*.TEMPLATE text
*.css text
Makefile text
# These tests are explicitly given specific line endings
test_suite/unix_line_endings.jsonnet text eol=lf
test_suite/dos_line_endings.jsonnet text eol=crlf
================================================
FILE: .github/workflows/build_and_test.yml
================================================
name: Build and Test
on:
pull_request:
types: [opened, reopened, synchronize, ready_for_review, review_requested]
branches-ignore:
- "gh-pages"
push:
branches:
- "master"
- "prepare-release"
tags:
- v*
workflow_dispatch:
permissions:
contents: read
jobs:
check_code_format:
name: Check code formatting
runs-on: "ubuntu-22.04"
# The code currently doesn't pass formatting.
# Enable this workflow job once it does, to detect regressions.
if: false
steps:
- uses: actions/checkout@v4
- name: Check clang-format (make test-formatting)
run: |
make test-formatting
plain_makefile:
name: Build and test using plain Makefile
runs-on: "ubuntu-22.04"
steps:
- uses: actions/checkout@v4
- name: Add system tools
run: |
sudo apt-get update && sudo apt-get install libgtest-dev help2man
- name: Build (make all)
run: |
make all
- name: Test (make test)
run: |
make test
python_module:
name: Build and test Python module
runs-on: "ubuntu-22.04"
strategy:
fail-fast: false
matrix:
# Python 3.6 isn't available on the ubuntu-22.04 GitHub runner
# (which is the oldest Ubuntu runner still available)
# Python 3.7 is too old for the version of setuptools that we request.
# (and we want that setuptools to be able to set certain compiler options correctly)
# Python 3.8 is the oldest we can easily support, I think.
# Note Python 3.8 and 3.9 are already _past_ end of life: https://devguide.python.org/versions/
# 3.8 EOL was 07 Oct 2024
# 3.9 EOL was 31 Oct 2025
python_version: ["3.8", "3.10", "3.14"]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "${{ matrix.python_version }}"
- name: Build
run: |
pip install build
python -m build --sdist --wheel
- name: Test
run: |
python -m venv --clear trial &&
cd trial &&
source bin/activate &&
pip install ../dist/jsonnet-*.whl &&
python3 ../python/_jsonnet_test.py
cmake_build:
name: Build and test using CMake
runs-on: "ubuntu-22.04"
steps:
- uses: actions/checkout@v4
- name: Configure (cmake)
run: |
cmake -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -B "${{github.workspace}}/build"
- name: Build (cmake --build)
working-directory: ${{github.workspace}}/build
run: |
cmake --build .
- name: Test (ctest))
working-directory: ${{github.workspace}}/build
run: |
ctest --output-on-failure
bazel_build:
name: Build and test using Bazel
runs-on: "ubuntu-22.04"
steps:
- uses: actions/checkout@v4
- name: Build
run: |
bazelisk build --lockfile_mode=error -c opt //cmd:all
- name: Test
run: |
bazelisk test --lockfile_mode=error //...
bazel_use_module:
name: Build Bazel example
runs-on: "ubuntu-22.04"
strategy:
fail-fast: false
matrix:
bazel_version: ["7.*", "8.*", "9.*"]
steps:
- uses: actions/checkout@v4
- name: Build
env:
USE_BAZEL_VERSION: ${{ matrix.bazel_version }}
run: |
cd examples/bazel
bazelisk build --lockfile_mode=off //...
cmake_example:
name: Build CMake example
runs-on: "ubuntu-22.04"
steps:
- uses: actions/checkout@v4
- name: Build
run: |
cd examples/cmake
BUILD_DIR="$(mktemp -d)"
cmake -GNinja -DCMAKE_BUILD_TYPE=Debug -S . -B "${BUILD_DIR}" && \
cmake --build "${BUILD_DIR}" -- -v && \
${BUILD_DIR}/jsonnet_cmake_example
================================================
FILE: .github/workflows/create_archive.sh
================================================
#!/usr/bin/env bash
# Copyright 2023 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -o errexit -o nounset -o pipefail
JSONNET_VERSION="$(grep -Ee '^\s*#\s*define\s+LIB_JSONNET_VERSION\s+"[^"]+"\s*$' include/libjsonnet.h | sed -E -e 's/[^"]+"([^"]+)".*/\1/')"
# GITHUB_REF is set by GH actions, see
# https://docs.github.com/en/actions/learn-github-actions/environment-variables#default-environment-variables
VERSION_SUFFIX=
if [[ ( "${GITHUB_REF_TYPE}" != 'branch' || "${GITHUB_REF_NAME}" != "prepare-release" ) &&
( "${GITHUB_REF_TYPE}" != 'tag' || "${GITHUB_REF_NAME}" != "${JSONNET_VERSION}" ) ]]; then
>&2 echo 'WARNING: Jsonnet library version in header does not match release ref. Adding commit suffix.'
VERSION_SUFFIX="-${GITHUB_SHA:0:9}"
fi
# A prefix is added to better match the GitHub generated archives.
PREFIX="jsonnet-${JSONNET_VERSION}${VERSION_SUFFIX}"
ARCHIVE="jsonnet-${JSONNET_VERSION}${VERSION_SUFFIX}.tar.gz"
git archive --format=tar --prefix=${PREFIX}/ "${GITHUB_SHA}" | gzip > "$ARCHIVE"
ARCHIVE_SHA=$(shasum -a 256 "$ARCHIVE" | awk '{print $1}')
echo "archive_sha256=${ARCHIVE_SHA}" >> "$GITHUB_OUTPUT"
echo "jsonnet_version=${JSONNET_VERSION}" >> "$GITHUB_OUTPUT"
echo "jsonnet_version_permanent=${JSONNET_VERSION}${VERSION_SUFFIX}" >> "$GITHUB_OUTPUT"
================================================
FILE: .github/workflows/doc_update.yml
================================================
name: Rebuild Docs
on:
pull_request:
types: [opened, reopened, synchronize, ready_for_review, review_requested]
branches-ignore:
- "gh-pages"
push:
branches:
- "master"
workflow_dispatch:
inputs:
build_wasm:
description: "Rebuild libjsonnet.wasm from source"
default: false
type: boolean
required: false
build_wasm_from_branch:
description: "go-jsonnet branch, tag or SHA to build from"
default: "master"
type: string
required: false
permissions:
contents: read
jobs:
build_libjsonnet_wasm:
name: Build libjsonnet.wasm for website
if: ${{ inputs.build_wasm }}
runs-on: "ubuntu-24.04"
outputs:
libjsonnet_wasm_sha256: ${{ steps.build.outputs.libjsonnet_wasm_sha256 }}
libjsonnet_wasm_artifact_id: ${{ steps.upload-wasm.outputs.artifact_id }}
steps:
- uses: actions/checkout@v6
with:
repository: google/go-jsonnet
ref: ${{ inputs.build_wasm_from_branch }}
submodules: false
- uses: actions/cache@v5
with:
path: |
~/.cache/bazel
~/.cache/bazelisk
key: ${{ runner.os }}-bazel-cache
- id: build
run: |
bazelisk test --lockfile_mode=error //...
bazelisk build --lockfile_mode=error //cmd/wasm:libjsonnet.wasm
WHERE="$(bazelisk cquery //cmd/wasm:libjsonnet.wasm --output files)"
cp "${WHERE}" ./
{ printf 'libjsonnet_wasm_sha256='; sha256sum --binary ./libjsonnet.wasm; } >> "$GITHUB_OUTPUT"
- name: Upload libjsonnet.wasm
id: upload-wasm
uses: actions/upload-artifact@v4
with:
path: ./libjsonnet.wasm
name: libjsonnet-wasm
if-no-files-found: "error"
retention-days: 4
include-hidden-files: false
build_website:
name: Build website
# Ordering dependency - this must run after building libjsonnet.wasm.
needs: build_libjsonnet_wasm
# Don't run if libjsonnet.wasm build _failed_ or the workflow cancelled, but run if it was skipped.
if: always() && !failure() && !cancelled()
runs-on: "ubuntu-24.04"
outputs:
diff_status: ${{ steps.diff-generated.outputs.diff_status }}
# Note upload-pages-artifact output name is artifact_id (with underscore).
pages_artifact_id: ${{ steps.upload-pages-package.outputs.artifact_id }}
# Note upload-artifact output name is artifact-id (with dash).
branch_content_artifact_id: ${{ steps.upload-full-archive.outputs.artifact-id }}
git_tree_hash: ${{ steps.diff-generated.outputs.git_tree_hash }}
steps:
- uses: actions/checkout@v6
- name: Setup Pages
if: ${{ github.repository == 'google/jsonnet' }}
uses: actions/configure-pages@v5
- name: Create Gemfile
run: |
echo $'source "https://rubygems.org"\n\ngem "jekyll"\n' > Gemfile
- name: Setup Ruby and Jekyll
uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c # v1.287.0
with:
ruby-version: "4.0.1"
bundler-cache: true
- name: Cache jsonnet binary
id: cache-jsonnet-binary
uses: actions/cache@v5
with:
key: jsonnet-bin-${{ hashFiles('include/*', 'core/*', 'cmd/*', 'cpp/*', 'third_party/**/*', 'stdlib/std.jsonnet') }}
path: ./jsonnet
- name: Build jsonnet binary
if: ${{ steps.cache-jsonnet-binary.outputs.cache-hit != 'true' }}
run: |
make jsonnet
- id: get_built_libjsonnet_wasm
continue-on-error: true
uses: actions/download-artifact@v7
with:
artifact-ids: ${{ needs.build_libjsonnet_wasm.outputs.libjsonnet_wasm_artifact_id }}
path: built_libjsonnet_wasm
- name: Set up output dir
id: make-output-dir
run: |
WORKDIR="$(mktemp -d)"
# If the workflow runs on a fork that doesn't have a gh-pages branch
# (which should be most forks) then we still want to be able to build
# the docs (so the repo owner can examine them), but we have no baseline.
# So we just build as though this is the first time.
if git fetch origin gh-pages; then
git worktree add --no-checkout --detach "$WORKDIR"/work FETCH_HEAD
else
echo "Repo has no gh-pages! Creating new orphan branch instead."
git worktree add --orphan -b gh-pages "$WORKDIR"/work
fi
echo "doc_output_dir=$WORKDIR" >> "$GITHUB_OUTPUT"
- name: Build website
env:
WORKDIR: ${{ steps.make-output-dir.outputs.doc_output_dir }}
WANT_BUILT_LIBJSONNET_WASM_PATH: ${{ steps.get_built_libjsonnet_wasm.outputs.download-path }}
WANT_BUILT_LIBJSONNET_WASM_SHA256: ${{ needs.build_libjsonnet_wasm.outputs.libjsonnet_wasm_sha256 }}
run: |
tools/scripts/update_web_content.sh
bundler exec jekyll build -s doc -d "$WORKDIR"/work
cd "$WORKDIR"/work
if [[ -z "${WANT_BUILT_LIBJSONNET_WASM_SHA256}" ]]; then
# Keep existing libjsonnet.wasm.
git checkout HEAD -- js/libjsonnet.wasm || echo "Could not find existing js/libjsonnet.wasm"
else
# Use a newly build libjsonnet.wasm.
cp "${WANT_BUILT_LIBJSONNET_WASM_PATH}"/libjsonnet.wasm ./js/libjsonnet.wasm
# Safety check - check that we transferred the file correctly.
echo "${WANT_BUILT_LIBJSONNET_WASM_SHA256}" | (cd ./js && sha256sum --check --strict)
fi
# Want a .nojekyll file while we're still publishing by pushing to gh-pages branch.
touch .nojekyll
git add .
- name: Diff docs
id: diff-generated
env:
WORKDIR: ${{ steps.make-output-dir.outputs.doc_output_dir }}
run: |
cd "$WORKDIR"/work
if git rev-parse --quiet --verify HEAD > /dev/null; then
git diff --cached --stat
# Only show the first 5000 lines of the diff output, for sanity.
git diff --cached | head -n5000
if git diff-index --quiet HEAD; then
echo "Generated docs are identical to existing gh-pages branch."
echo "diff_status=clean" >> "$GITHUB_OUTPUT"
else
echo "Generated docs differ from existing gh-pages branch."
echo "diff_status=changed" >> "$GITHUB_OUTPUT"
fi
else
echo "No HEAD revision; probably on an orphan branch. Skipping diff step."
echo "diff_status=changed" >> "$GITHUB_OUTPUT"
fi
TREE_SHA1=$(git write-tree)
echo "Computed sha1 for new gh-pages tree: $TREE_SHA1"
echo "git_tree_hash=$TREE_SHA1" >> "$GITHUB_OUTPUT"
git archive --format=tar -o ../gh-pages-content.tar "$TREE_SHA1"
- name: Upload full archive
id: upload-full-archive
if: ${{ steps.diff-generated.outputs.diff_status == 'changed' }}
uses: actions/upload-artifact@v4
with:
path: ${{ steps.make-output-dir.outputs.doc_output_dir }}/gh-pages-content.tar
name: full-gh-pages-content
if-no-files-found: "error"
retention-days: 4
include-hidden-files: true
- name: Upload Pages package
id: upload-pages-package
if: ${{ github.repository == 'google/jsonnet' && steps.diff-generated.outputs.diff_status == 'changed' }}
uses: actions/upload-pages-artifact@v4
with:
path: ${{ steps.make-output-dir.outputs.doc_output_dir }}/work/
push_pages_branch:
name: Update gh-pages branch
needs: build_website
if: always() && github.repository == 'google/jsonnet' && contains(fromJSON('["push", "workflow_dispatch"]'), github.event_name) && needs.build_website.result == 'success' && needs.build_website.outputs.diff_status == 'changed'
permissions:
contents: write
environment:
name: pages-via-branch-push
runs-on: "ubuntu-24.04"
steps:
- uses: actions/checkout@v6
with:
ref: gh-pages
path: repo
- uses: actions/download-artifact@v7
with:
artifact-ids: ${{ needs.build_website.outputs.branch_content_artifact_id }}
path: built
- name: Extract and push
env:
WANT_TREE_SHA1: ${{ needs.build_website.outputs.git_tree_hash }}
GIT_AUTHOR_NAME: "github-actions[bot]"
GIT_AUTHOR_EMAIL: "41898282+github-actions[bot]@users.noreply.github.com"
GIT_COMMITTER_NAME: "github-actions[bot]"
GIT_COMMITTER_EMAIL: "41898282+github-actions[bot]@users.noreply.github.com"
run: |
[[ ! -z "$WANT_TREE_SHA1" ]] || {
>&2 echo "did not get valid sha1 hash for expected git tree from builder job"
exit 1
}
cd repo
rm --one-file-system -r -- $(git ls-tree --name-only HEAD)
echo "Cleared working dir. Content is now:"
ls -R "$GITHUB_WORKSPACE"
echo "Unpacking artifact from builder job."
tar -xf ../built/gh-pages-content.tar
git add .
git diff --cached --stat
UNPACKED_TREE_SHA1=$(git write-tree)
echo "Expect tree SHA1: $WANT_TREE_SHA1 (computed in build step)"
echo "Unpacked tree SHA1: $UNPACKED_TREE_SHA1"
[[ "$WANT_TREE_SHA1" = "$UNPACKED_TREE_SHA1" ]] || {
>&2 echo "builder-produced tree differs from extracted tree"
exit 1
}
git commit -m 'Update docs.'
git log -n1
git push
publish_pages:
name: Direct publish pages
needs: build_website
if: false && github.repository == 'google/jsonnet' && contains(fromJSON('["push", "workflow_dispatch"]'), github.event_name) && needs.build_website.result == 'success' && needs.build_website.outputs.diff_status == 'changed'
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: "ubuntu-24.04"
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
================================================
FILE: .github/workflows/publish-python.yml
================================================
name: Build and Publish Python Package
# Be very careful granting extra permissions here, as this workflow uses third party actions.
# Prefer to pin to exact commits for third-party actions. I'm making an exception for actions
# maintained by GitHub itself.
# For now, just trigger this workflow manually.
on:
workflow_dispatch:
inputs:
upload_to_pypi:
description: "Upload generate package files to PyPI"
required: true
type: boolean
pypi_environment:
description: "Which PyPI instance to publish to"
required: true
type: choice
options:
- testpypi
- pypi
jobs:
build_sdist:
name: Build Python sdist
runs-on: ubuntu-24.04
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.8"
cache: "pip"
- run: pip install 'build==1.2.2'
- name: Build sdist
run: python3 -m build --sdist
- uses: actions/upload-artifact@v4
with:
name: sdist
path: ./dist/*.gz
if-no-files-found: error
build_wheels:
name: Build wheels on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-22.04, windows-latest, macos-14, macos-latest]
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- name: Build wheels
uses: pypa/cibuildwheel@298ed2fb2c105540f5ed055e8a6ad78d82dd3a7e # v3.3.1
env:
# CIBuildWheel itself no longer supports earlier than Python 3.8, which is
# the earliest we try to support here. Also likely cibuildwheel will soon
# drop support for 3.8, see https://github.com/pypa/cibuildwheel/issues/2685
CIBW_SKIP: "*-win32 *-manylinux_i686 *-musllinux_i686"
CIBW_TEST_COMMAND: >
python {package}/python/_jsonnet_test.py
- uses: actions/upload-artifact@v4
with:
name: cibw-wheels-${{ matrix.os }}
path: ./wheelhouse/*.whl
if-no-files-found: error
upload_to_pypi:
name: "Upload packages to PyPI"
needs: [build_sdist, build_wheels]
runs-on: ubuntu-24.04
if: "${{ inputs.upload_to_pypi }}"
permissions:
contents: read
id-token: write # Needed for PyPI Trusted Publishing
environment:
name: "${{ inputs.pypi_environment }}"
url: "${{ inputs.pypi_environment == 'pypi' && 'https://pypi.org/p/jsonnet' || 'https://test.pypi.org/p/jsonnet' }}"
steps:
- uses: actions/download-artifact@v4
with:
path: cibw-wheels
pattern: cibw-wheels-*
- uses: actions/download-artifact@v4
with:
path: sdist
name: sdist
- name: Flatten wheels to one directory
run: |
mkdir dist
find cibw-wheels/ -type f -name '*.whl' -exec mv '{}' ./dist/ ';'
find sdist/ -type f -name '*.gz' -exec mv '{}' ./dist/ ';'
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
with:
verbose: true
print-hash: true
repository-url: "${{ inputs.pypi_environment == 'testpypi' && 'https://test.pypi.org/legacy/' || '' }}"
================================================
FILE: .github/workflows/release.yml
================================================
# Copyright 2023 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Cut a release whenever a new tag is pushed to the repo.
name: Release
on:
workflow_dispatch:
inputs:
prerelease:
description: If set, publish this as a release candidate / prerelease version.
type: boolean
required: true
jobs:
build:
permissions:
contents: write
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Create release archive
id: create_archive
run: .github/workflows/create_archive.sh
- name: Release
uses: softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda # v2.2.1
with:
name: ${{ steps.create_archive.outputs.jsonnet_version }}
tag_name: ${{ steps.create_archive.outputs.jsonnet_version }}
prerelease: ${{ inputs.prerelease }}
draft: true
fail_on_unmatched_files: true
files: jsonnet-*.tar.gz
================================================
FILE: .gitignore
================================================
**/core
!core/
**/*~
**/*.pyc
**/.*.swp
**/.*.swo
**/*.o
**/*.a
**/*.dylib
*.dSYM
.makebuild/
jsonnet
jsonnetfmt
_jsonnet.so
libjsonnet.so
libjsonnet.so.*
libjsonnet++.so
libjsonnet++.so.*
**/core.*
**/vgcore
**/vgcore.*
core/std.jsonnet.h
stdlib/to_c_array
Makefile.depend
Makefile.depend.bak
bazel-*
libjsonnet_file_test
libjsonnet_native_callbacks_test
libjsonnet_locale_test
libjsonnet_test
libjsonnet++_test
unicode_test
lexer_test
parser_test
**/*.tfstate
**/*.tfstate.backup
/build/
/external/
/dist/
/jsonnet.egg-info/
/python/jsonnet.egg-info/
/doc/.jekyll-cache/
/production/
/doc/production/
/doc/js/libjsonnet.wasm
/man
# CMake
**/CMakeCache.txt
**/CMakeFiles
**/cmake_install.cmake
**/CTestTestfile.cmake
tags
bin/
Testing/
cmake_test_discovery_*.json
# Ignore auto-generated makefiles from CMake.
**/Makefile
^Makefile/
**/.DS_Store
.vscode
================================================
FILE: CMakeLists.txt
================================================
cmake_minimum_required(VERSION 3.15...4.1)
#### Check important configuration pre-requisites.
#
# Discourage in-source builds; they overwrite the hand-written Makefile, and generally cause confusion.
# Use `cmake . -B<dir>` or the CMake GUI to do an out-of-source build.
if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
message(FATAL_ERROR "Out-of-source builds are recommended for this project.")
endif()
#### Extract version from include/libjsonnet.h so it can be put in the project version.
#
# Extract release version number from include/libjsonnet.h.
# We do this in various other (non-CMake-build) places too, e.g., the Python wheel build.
set(JSONNET_HEADER_VERSION_REGEX
[=[^[ \t]*#[ \t]*define[ \t]+LIB_JSONNET_VERSION[ \t]+\"v([0-9.]+(-?[a-z][a-z0-9]*)?)\"[ \t]*$]=])
file(
STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/include/libjsonnet.h JSONNET_HEADER_VERSION
LIMIT_COUNT 1
REGEX ${JSONNET_HEADER_VERSION_REGEX})
string(REGEX REPLACE ${JSONNET_HEADER_VERSION_REGEX} "\\1" JSONNET_HEADER_VERSION "${JSONNET_HEADER_VERSION}")
message(VERBOSE "Extracted version from include/libjsonnet.h: ${JSONNET_HEADER_VERSION}")
#### Set CMake project.
#
project(
jsonnet
HOMEPAGE_URL "https://jsonnet.org/"
LANGUAGES C CXX)
#### Unconditional CMake module includes.
#
include(GNUInstallDirs)
#### Set up cacheable/user-configurable state.
#
# User-configurable options.
option(BUILD_JSONNET "Build jsonnet command-line tool." ON)
option(BUILD_JSONNETFMT "Build jsonnetfmt command-line tool." ON)
option(BUILD_TESTS "Build and run jsonnet tests." ON)
option(BUILD_STATIC_LIBS "Build a static libjsonnet." ON)
option(BUILD_SHARED_LIBS "Build shared libjsonnet." ON)
option(BUILD_SHARED_BINARIES "Link binaries to the shared libjsonnet instead of the static one." OFF)
option(BUILD_MAN_PAGES "Build manpages." ON)
option(USE_SYSTEM_GTEST "Use system-provided gtest library" OFF)
option(USE_SYSTEM_JSON "Use the system-provided json library" OFF)
option(USE_SYSTEM_RAPIDYAML "Use the system-provided rapidyaml library" OFF)
#### Compute derived values from user-configurable state.
#
# Helper variable set to ON if there is any reason we need to build the jsonnet command binaries.
if(BUILD_TESTS OR BUILD_JSONNET OR BUILD_JSONNETFMT)
set(BUILD_SOME_BINARIES ON)
else()
set(BUILD_SOME_BINARIES OFF)
endif()
#### System package searches.
#
if(USE_SYSTEM_JSON)
find_package(nlohmann_json 3.6.1 REQUIRED)
endif()
if(USE_SYSTEM_RAPIDYAML)
find_package(ryml REQUIRED VERSION 0.10.0)
endif()
#### Utility function to configure a target with our preferred C and C++ compilation flags.
#
function(configure_target_cc_props LIB_TARGET_NAME)
set_property(TARGET ${LIB_TARGET_NAME} PROPERTY CXX_STANDARD 17)
set_property(TARGET ${LIB_TARGET_NAME} PROPERTY CXX_EXTENSIONS OFF)
set_property(TARGET ${LIB_TARGET_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET ${LIB_TARGET_NAME} PROPERTY C_STANDARD 99)
set_property(TARGET ${LIB_TARGET_NAME} PROPERTY C_EXTENSIONS OFF)
set_property(TARGET ${LIB_TARGET_NAME} PROPERTY C_STANDARD_REQUIRED ON)
if (NOT MSVC)
target_compile_options(${LIB_TARGET_NAME}
PRIVATE
-Wall -Wextra -Wimplicit-fallthrough
-pedantic
$<$<COMPILE_LANGUAGE:CXX>:-Woverloaded-virtual>
)
endif()
endfunction()
#### Sub-directory CMakeLists includes.
#
add_subdirectory(stdlib)
#### Utility function to set up all the properties for an OBJECT library for the jsonnet core.
#
# This is done as a function because there separate object libraries for shared vs. static.
# Shared has slightly different compilation flags (it needs -fPIC).
#
function(configure_jsonnet_obj_target LIB_TARGET_NAME)
configure_target_cc_props(${LIB_TARGET_NAME})
target_sources(${LIB_TARGET_NAME}
PRIVATE
third_party/md5/md5.h
third_party/md5/md5.cpp
core/static_error.h
core/desugarer.h
core/unicode.h
core/vm.h
core/static_analysis.h
core/path_utils.h
core/state.h
core/pass.h
core/ast.h
core/json.h
core/string_utils.h
core/formatter.h
core/parser.h
core/lexer.h
core/desugarer.cpp
core/formatter.cpp
core/lexer.cpp
core/libjsonnet.cpp
core/parser.cpp
core/pass.cpp
core/path_utils.cpp
core/static_analysis.cpp
core/string_utils.cpp
core/vm.cpp
PUBLIC
include/libjsonnet.h
include/libjsonnet_fmt.h
)
target_link_libraries(${LIB_TARGET_NAME} PRIVATE stdlib_h)
if(USE_SYSTEM_JSON)
target_link_libraries(${LIB_TARGET_NAME} PRIVATE nlohmann_json::nlohmann_json)
else()
target_sources(${LIB_TARGET_NAME}
PRIVATE
third_party/json/nlohmann/json.hpp
)
target_include_directories(${LIB_TARGET_NAME}
SYSTEM PRIVATE third_party/json)
endif()
if(USE_SYSTEM_RAPIDYAML)
target_link_libraries(${LIB_TARGET_NAME} PRIVATE ryml::ryml)
target_compile_definitions(${LIB_TARGET_NAME} PRIVATE USE_SYSTEM_RAPIDYAML)
else()
target_sources(${LIB_TARGET_NAME}
PRIVATE
third_party/rapidyaml/rapidyaml-0.10.0.hpp
third_party/rapidyaml/rapidyaml.cpp
)
endif()
target_include_directories(${LIB_TARGET_NAME}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
PRIVATE
third_party/md5
$<$<NOT:$<BOOL:${USE_SYSTEM_RAPIDYAML}>>:${CMAKE_CURRENT_SOURCE_DIR}/third_party/rapidyaml>
)
endfunction()
#### Utility function to set up library target properties for the C lib.
#
function(configure_jsonnet_lib_target LIB_TARGET_NAME OBJ_TARGET_NAME)
configure_target_cc_props(${LIB_TARGET_NAME})
target_link_libraries(${LIB_TARGET_NAME} PUBLIC ${OBJ_TARGET_NAME})
set(JSONNET_PUBLIC_HEADERS include/libjsonnet.h include/libjsonnet_fmt.h)
set_target_properties(${LIB_TARGET_NAME} PROPERTIES
OUTPUT_NAME jsonnet
PUBLIC_HEADER "${JSONNET_PUBLIC_HEADERS}")
endfunction()
#### Utility function to set up library target properties for the C++ lib.
#
function(configure_jsonnet_cpp_lib_target LIB_TARGET_NAME OBJ_TARGET_NAME)
configure_target_cc_props(${LIB_TARGET_NAME})
target_sources(${LIB_TARGET_NAME}
PRIVATE
cpp/libjsonnet++.cpp
include/libjsonnet++.h
)
target_link_libraries(${LIB_TARGET_NAME} PUBLIC ${OBJ_TARGET_NAME})
set(JSONNET_PUBLIC_HEADERS include/libjsonnet.h include/libjsonnet++.h)
set_target_properties(${LIB_TARGET_NAME} PROPERTIES
OUTPUT_NAME jsonnet++
PUBLIC_HEADER "${JSONNET_PUBLIC_HEADERS}")
endfunction()
#### Static library target setup.
#
if(BUILD_STATIC_LIBS OR (BUILD_SOME_BINARIES AND NOT BUILD_SHARED_BINARIES))
add_library(jsonnet_obj_static OBJECT)
configure_jsonnet_obj_target(jsonnet_obj_static)
add_library(jsonnet_static STATIC)
configure_jsonnet_lib_target(jsonnet_static jsonnet_obj_static)
add_library(jsonnet_cpp_static STATIC)
configure_jsonnet_cpp_lib_target(jsonnet_cpp_static jsonnet_obj_static)
if(BUILD_STATIC_LIBS)
install(TARGETS jsonnet_static jsonnet_cpp_static)
endif()
endif()
#### Shared library target setup.
#
if(BUILD_SHARED_LIBS OR (BUILD_SOME_BINARIES AND BUILD_SHARED_BINARIES))
add_library(jsonnet_obj_shared OBJECT)
set_property(TARGET jsonnet_obj_shared PROPERTY POSITION_INDEPENDENT_CODE ON)
configure_jsonnet_obj_target(jsonnet_obj_shared)
add_library(jsonnet_shared SHARED)
configure_jsonnet_lib_target(jsonnet_shared jsonnet_obj_shared)
set_target_properties(jsonnet_shared PROPERTIES
VERSION "${JSONNET_HEADER_VERSION}"
SOVERSION "0")
add_library(jsonnet_cpp_shared SHARED)
configure_jsonnet_cpp_lib_target(jsonnet_cpp_shared jsonnet_obj_shared)
set_target_properties(jsonnet_cpp_shared PROPERTIES
VERSION "${JSONNET_HEADER_VERSION}"
SOVERSION "0")
if(BUILD_SHARED_LIBS)
install(TARGETS jsonnet_shared jsonnet_cpp_shared)
endif()
endif()
#### Alias the library to use for binaries.
#
if(BUILD_SHARED_BINARIES)
add_library(jsonnet_lib_for_binaries ALIAS jsonnet_shared)
add_library(jsonnet_cpp_lib_for_binaries ALIAS jsonnet_cpp_shared)
else()
add_library(jsonnet_lib_for_binaries ALIAS jsonnet_static)
add_library(jsonnet_cpp_lib_for_binaries ALIAS jsonnet_cpp_static)
endif()
#### An object library for the utils.cpp code which is shared by both CLI binaries.
#
if(BUILD_SOME_BINARIES)
add_library(jsonnet_cmd_utils OBJECT
cmd/utils.cpp
cmd/utils.h
)
endif()
#### CLI (jsonnet and jsonnetfmt) binary targets.
#
if(BUILD_JSONNET OR BUILD_TESTS)
add_executable(jsonnet
cmd/jsonnet.cpp
$<TARGET_OBJECTS:jsonnet_cmd_utils>
)
target_link_libraries(jsonnet PRIVATE jsonnet_lib_for_binaries)
if(BUILD_JSONNET)
install(TARGETS jsonnet)
endif()
endif()
if(BUILD_JSONNETFMT OR BUILD_TESTS)
add_executable(jsonnetfmt
cmd/jsonnetfmt.cpp
$<TARGET_OBJECTS:jsonnet_cmd_utils>
)
target_link_libraries(jsonnetfmt PRIVATE jsonnet_lib_for_binaries)
if(BUILD_JSONNETFMT)
install(TARGETS jsonnetfmt)
endif()
endif()
#### GoogleTest based tests.
#
if(BUILD_TESTS)
enable_testing()
include(GoogleTest)
if(USE_SYSTEM_GTEST)
find_package(GTest REQUIRED)
else()
include(FetchContent)
FetchContent_Declare(googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG v1.17.0
)
# For Windows: Prevent overriding the parent project's compiler/linker settings.
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
# Prevent including GoogleTest in the generated install rules.
set(INSTALL_GTEST OFF CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
endif()
set(JSONNET_TEST_TARGETS)
function(jsonnet_add_gtest TESTNAME JSONNET_LIB_TARGET)
set(JSONNET_TEST_TARGETS ${JSONNET_TEST_TARGETS} ${TESTNAME} PARENT_SCOPE)
add_executable(${TESTNAME} ${ARGN})
target_link_libraries(${TESTNAME} ${JSONNET_LIB_TARGET} gtest gmock gtest_main)
gtest_discover_tests(${TESTNAME}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
PROPERTIES
VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
ENVIRONMENT "JSONNET_SOURCE_BASE=${PROJECT_SOURCE_DIR}"
)
set_target_properties(${TESTNAME} PROPERTIES FOLDER tests)
endfunction()
function(jsonnet_add_raw_test TESTNAME JSONNET_LIB_TARGET)
set(JSONNET_TEST_TARGETS ${JSONNET_TEST_TARGETS} ${TESTNAME} PARENT_SCOPE)
add_executable(${TESTNAME} ${ARGN})
target_link_libraries(${TESTNAME} ${JSONNET_LIB_TARGET})
set_target_properties(${TESTNAME} PROPERTIES FOLDER tests)
add_test(NAME ${TESTNAME} COMMAND ${TESTNAME})
endfunction()
jsonnet_add_gtest(test_core_unicode jsonnet_lib_for_binaries core/unicode_test.cpp)
jsonnet_add_gtest(test_core_lexer jsonnet_lib_for_binaries core/lexer_test.cpp)
jsonnet_add_gtest(test_core_parser jsonnet_lib_for_binaries core/parser_test.cpp)
jsonnet_add_gtest(test_core_libjsonnet jsonnet_lib_for_binaries core/libjsonnet_test.cpp)
jsonnet_add_gtest(test_cpp_libjsonnet jsonnet_cpp_lib_for_binaries cpp/libjsonnet++_test.cpp)
jsonnet_add_gtest(test_cpp_libjsonnet_locale jsonnet_cpp_lib_for_binaries cpp/libjsonnet_locale_test.cpp)
jsonnet_add_raw_test(test_core_libjsonnet_native_callbacks jsonnet_lib_for_binaries core/libjsonnet_native_callbacks_test.c)
# core/libjsonnet_file_test needs an input file
add_executable(test_libjsonnet_file core/libjsonnet_file_test.c)
target_link_libraries(test_libjsonnet_file jsonnet_lib_for_binaries)
set_target_properties(test_libjsonnet_file PROPERTIES FOLDER tests)
add_test(
NAME test_libjsonnet_file
COMMAND test_libjsonnet_file "test_suite/object.jsonnet"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
)
add_subdirectory(test_suite)
# `run_tests` target builds and runs all tests
add_custom_target(run_tests COMMAND ${CMAKE_CTEST_COMMAND}
DEPENDS
jsonnet jsonnetfmt test_libjsonnet_file ${JSONNET_TEST_TARGETS}
)
endif() # if(BUILD_TESTS)
#### Man pages
#
if(BUILD_MAN_PAGES AND (BUILD_JSONNET OR BUILD_JSONNETFMT))
find_program(HELP2MAN_BINARY NAMES help2man)
if (HELP2MAN_BINARY)
message(STATUS "help2man found, man pages will be generated.")
file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/man/man1")
if(BUILD_JSONNET)
add_custom_command(
OUTPUT "${PROJECT_BINARY_DIR}/man/man1/jsonnet.1"
COMMAND "${HELP2MAN_BINARY}"
ARGS --section=1 --no-info --name="Jsonnet data templating language interpreter" --output="${PROJECT_BINARY_DIR}/man/man1/jsonnet.1" "$<TARGET_FILE:jsonnet>"
DEPENDS jsonnet
)
endif()
if(BUILD_JSONNETFMT)
add_custom_command(
OUTPUT "${PROJECT_BINARY_DIR}/man/man1/jsonnetfmt.1"
COMMAND "${HELP2MAN_BINARY}"
ARGS --section=1 --no-info --name="Jsonnet data templating language auto-formatter" --output="${PROJECT_BINARY_DIR}/man/man1/jsonnetfmt.1" "$<TARGET_FILE:jsonnetfmt>"
DEPENDS jsonnetfmt
)
endif()
add_custom_target(jsonnet-man ALL DEPENDS "${PROJECT_BINARY_DIR}/man/man1/jsonnet.1")
add_custom_target(jsonnetfmt-man ALL DEPENDS "${PROJECT_BINARY_DIR}/man/man1/jsonnetfmt.1")
install(FILES ${PROJECT_BINARY_DIR}/man/man1/jsonnet.1 DESTINATION "${CMAKE_INSTALL_MANDIR}/man1")
install(FILES ${PROJECT_BINARY_DIR}/man/man1/jsonnetfmt.1 DESTINATION "${CMAKE_INSTALL_MANDIR}/man1")
else()
message(STATUS "help2man not found, man pages will not be generated.")
endif()
endif() # if(BUILD_MAN_PAGES)
#### CMake debugging outputs
#
# Note cmake_language GET_MESSAGE_LOG_LEVEL exists only in 3.25 and above.
if(CMAKE_VERSION VERSION_GREATER "3.25")
include(CMakePrintHelpers)
cmake_language(GET_MESSAGE_LOG_LEVEL CURRENT_CMAKE_LOG_LEVEL)
if(CURRENT_CMAKE_LOG_LEVEL MATCHES "TRACE")
# Print specific properties for specific targets
cmake_print_properties(
TARGETS
to_c_array
stdlib_h
jsonnet_obj_static
jsonnet_obj_shared
jsonnet_static
jsonnet_shared
jsonnet_cpp_static
jsonnet_cpp_shared
jsonnet_cmd_utils
jsonnet
jsonnetfmt
jsonnet-man
jsonnetfmt-man
PROPERTIES
TYPE
C_STANDARD
CXX_STANDARD
POSITION_INDEPENDENT_CODE
PUBLIC_LINK_DEPENDS
INTERFACE_LINK_DEPENDS
PUBLIC_LINK_LIBRARIES
INTERFACE_LINK_LIBRARIES
PUBLIC_INCLUDE_DIRECTORIES
INTERFACE_INCLUDE_DIRECTORIES
OUTPUT_NAME
PUBLIC_HEADER
RUNTIME_OUTPUT_DIRECTORY
)
endif()
endif()
================================================
FILE: CONTRIBUTING
================================================
Before we can merge your pull request, we need you to sign either the Google individual or corporate
contributor license agreement (CLA), unless you are a Google employee, intern, or contractor.
Please see https://jsonnet.org/learning/community.html#license for more information.
================================================
FILE: Dockerfile
================================================
FROM alpine:latest AS builder
RUN apk -U add build-base
WORKDIR /opt
COPY . /opt/jsonnet
RUN cd jsonnet && \
make
FROM alpine:latest
RUN apk add --no-cache libstdc++
COPY --from=builder /opt/jsonnet/jsonnet /usr/local/bin
COPY --from=builder /opt/jsonnet/jsonnetfmt /usr/local/bin
ENTRYPOINT ["/usr/local/bin/jsonnet"]
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: MANIFEST.in
================================================
include LICENSE include/*.h core/*.cpp core/*.h python/*.c stdlib/std.jsonnet Makefile
recursive-include third_party/json *.hpp
include third_party/md5/*.cpp third_party/md5/*.h
include third_party/rapidyaml/*.cpp third_party/rapidyaml/*.hpp
#recursive-include test_suite examples gc_stress benchmarks editors
================================================
FILE: MODULE.bazel
================================================
module(name = "jsonnet")
bazel_dep(name = "googletest", version = "1.16.0")
bazel_dep(name = "rules_python", version = "1.2.0")
bazel_dep(name = "rules_cc", version = "0.2.16")
bazel_dep(name = "rules_shell", version = "0.6.1")
================================================
FILE: PYTHON_README.md
================================================
# Jsonnet - The data templating language
For an introduction to Jsonnet and documentation,
[visit our website](https://jsonnet.org).
This is the Python module for the original C++ implementation of Jsonnet.
**Security notes:** The C++ implementation is not suitable for processing *untrusted inputs* without significant external effort to sandbox it. It is not hardened and may have unknown exploitable bugs. It is intended for use to evaluate Jsonnet code that you trust not to be malicious (e.g., code written by you/your organisation). Even ignoring the risk of exploitable bugs in the implementation, the `import`, `importstr`, and `importbin` language constructs can potentially be used to exfiltrate sensitive data unless you take extra steps to restrict these or sandbox the jsonnet interpreter. By default, these constructs can import from any path accessible to the interpreter process.
## Using the Jsonnet Python module
You can install from PyPI with `uv add jsonnet` or with your preferred Python package management tool.
The two main functions in the `_jsonnet` package are `evaluate_file` and `evaluate_snippet`:
- `evaluate_file(filename, ...)` reads and evalutes the file at the given path, returning an output as a JSON string.
- `evaluate_snippet(filename, src, ...)` evaluates the given source code (`src`), returning an output as a JSON string. The provided filename is used in error messages.
The functions support keyword arguments:
- `jpathdir`: A string (path to a directory) or list of strings (list of directories) to be added to the import search path.
- `ext_vars`, `ext_codes`: Dictionaries of variables to set; these can be used from within the evaluated code through the `std.extVar` Jsonnet function. `ext_codes` values are Jsonnet expressions, `ext_vars` values are provided to Jsonnet as plain strings.
- `tla_vars`, `tla_codes`: Dictionaries of Top-Level arguments. If the provided Jsonnet code to evaluate represents a function, that function is called with these values as (named) arguments.
- `import_callback`: A function which will be called when `import` (or `importstr`, `importbin`) expressions are evaluated. See below.
- `native_callbacks`: A dictionary of functions which can be called from Jsonnet using the Jsonnet `std.native` function. See below.
And some configuration for internal implementation details:
- `max_stack`
- `max_trace`
- `gc_min_objects`
- `gc_growth_trigger`
### `import_callback`
Usage example:
```python
import _jsonnet
FILES = {
"the_message.txt": b"hello, world",
}
def import_callback_memfile(dir, rel):
"""Custom import function which only returns files from some in-memory storage.
Args:
dir: The directory part of the file in which the `import` occurred.
rel: The path string passed to the `import` expression.
"""
if rel in FILES:
# Note that the returned file _content_ should be a bytes value, not a string.
return rel, FILES[rel]
raise RuntimeError('File not found')
result = _jsonnet.evaluate_snippet(
'example',
'local the_message = importstr "the_message.txt"; ' +
'{ msg: the_message }',
import_callback=import_callback_memfile)
assert result == '{\n "msg": "hello, world"\n}\n';
```
### `native_callbacks`
Usage example:
```python
import _jsonnet
def concat(a, b):
return a + b
native_callbacks = {
'concat': (('a', 'b'), concat),
}
result = _jsonnet.evaluate_snippet(
'example',
'local concat = std.native("concat"); ' +
'concat("hello, ", "world")',
native_callbacks=native_callbacks)
assert result == '"hello, world"\n';
```
================================================
FILE: README.md
================================================
# Jsonnet - The data templating language

For an introduction to Jsonnet and documentation,
[visit our website](https://jsonnet.org).
This repository contains the original implementation. You can also try [go-jsonnet](https://github.com/google/go-jsonnet), a newer implementation which in some cases is orders of magnitude faster, and is recommended in preference to the C++ version.
Visit our [discussion forum](https://groups.google.com/g/jsonnet).
**Security notes:** If you need to process *untrusted inputs* (untrusted Jsonnet code), it is best not to use the C++ implementation, as it is not hardened for that use-case. The expected use-case is for evaluating Jsonnet code that you / your organisation has written and trusts not to be malicious. Even ignoring the risk of exploitable bugs in the implementation, the `import`, `importstr`, and `importbin` language constructs can potentially be used to exfiltrate sensitive data unless you take extra steps to restrict these or sandbox the jsonnet interpreter. By default, these constructs can import from any path accessible to the interpreter process.
## Packages
Jsonnet is available on Homebrew:
```
brew install jsonnet
```
[Jsonnet](https://packages.msys2.org/base/mingw-w64-jsonnet) is available on [MSYS2](https://www.msys2.org/):
```
pacman -S mingw-w64-clang-i686-jsonnet
```
```
pacman -S mingw-w64-clang-x86_64-jsonnet
```
```
pacman -S mingw-w64-i686-jsonnet
```
```
pacman -S mingw-w64-x86_64-jsonnet
```
```
pacman -S mingw-w64-ucrt-x86_64-jsonnet
```
The Python binding is on pypi:
```
pip install jsonnet
```
You can also download and install Jsonnet using the [vcpkg](https://github.com/Microsoft/vcpkg/)
dependency manager:
```
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
vcpkg install jsonnet
```
The Jsonnet port in vcpkg is kept up to date by Microsoft team members and community contributors.
If the version is out of date, please [create an issue or pull
request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.
## Building Jsonnet
You can use either GCC or Clang to build Jsonnet. Note that on recent versions
of macOS, `/usr/bin/gcc` and `/usr/bin/g++` are actually Clang, so there is no
difference.
### Makefile
To build Jsonnet with GCC, run:
```
make
```
To build Jsonnet with Clang, run:
```
make CC=clang CXX=clang++
```
To run the output binary, run:
```
./jsonnet
```
To run the reformatter, run:
```
./jsonnetfmt
```
### Bazel
Bazel builds are also supported.
Install [Bazel](https://www.bazel.io/versions/master/docs/install.html) if it is
not installed already. Then, run the following command to build with GCC:
```
bazel build -c opt //cmd:all
```
To build with Clang, use one of these two options:
```
env CC=clang CXX=clang++ bazel build -c opt //cmd:all
# OR
bazel build -c opt --action_env=CC=clang --action_env=CXX=clang++ //cmd:all
```
This builds the `jsonnet` and `jsonnetfmt` targets defined in [`cmd/BUILD`](./cmd/BUILD). To launch
the output binaries, run:
```
bazel-bin/cmd/jsonnet
bazel-bin/cmd/jsonnetfmt
```
### CMake
```
cmake . -Bbuild
```
```
cmake --build build --target run_tests
```
## Contributing
See the [contributing page](https://jsonnet.org/learning/community.html#license) on our website.
## Developing Jsonnet
### Running tests
To run the comprehensive suite:
```
make test
```
### Locally serving the website
You need a `doc/js/libjsonnet.wasm` which can either be downloaded from the
production website:
```
wget https://jsonnet.org/js/libjsonnet.wasm -O doc/js/libjsonnet.wasm
```
Or you can build it yourself, which requires checking out
[go-jsonnet](https://github.com/google/go-jsonnet). See the README.md in
that repo for instructions.
The standard library is documented in a structured format in `doc/_stdlib_gen/stdlib-content.jsonnet`.
The HTML (input for Jekyll) is regenerated using the following command:
```
tools/scripts/update_web_content.sh
```
Then, from the root of the repository you can generate and serve the website using
[Jekyll](https://jekyllrb.com/) (you need version 4.3.0 or later):
```
jekyll serve -s doc/
```
This should build and serve the website locally, and automatically rebuild
when you change any underlying files.
================================================
FILE: benchmarks/.gitignore
================================================
*.gen.jsonnet
================================================
FILE: benchmarks/bench.01.jsonnet
================================================
/*
Copyright 2015 Google Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
local sum(x) =
if x == 0 then
0
else
x + sum(x - 1);
sum(300)
================================================
FILE: benchmarks/bench.02.jsonnet
================================================
/*
Copyright 2015 Google Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
local Fib = {
n: 1,
local outer = self,
r: if self.n <= 1 then 1 else (Fib { n: outer.n - 1 }).r + (Fib { n: outer.n - 2 }).r,
};
(Fib { n: 25 }).r
================================================
FILE: benchmarks/bench.03.jsonnet
================================================
/*
Copyright 2015 Google Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
local fibonacci(n) =
if n <= 1 then
1
else
fibonacci(n - 1) + fibonacci(n - 2);
fibonacci(25)
================================================
FILE: benchmarks/bench.04.jsonnet
================================================
std.foldl(function(e, res) e + res, std.makeArray(20000, function(i) 'aaaaa'), '')
================================================
FILE: benchmarks/bench.06.jsonnet
================================================
// A benchmark for builtin sort
local reverse = std.reverse;
local sort = std.sort;
true
&& std.assertEqual(std.range(1, 500), sort(std.range(1, 500)))
&& std.assertEqual(std.range(1, 1000), sort(std.range(1, 1000)))
&& std.assertEqual(reverse(std.range(1, 1000)), sort(std.range(1, 1000), keyF=function(x) -x))
&& std.assertEqual(std.range(1, 1000), sort(reverse(std.range(1, 1000))))
&& std.assertEqual(std.makeArray(2000, function(i) std.floor((i + 2) / 2)), sort(std.range(1, 1000) + reverse(std.range(1, 1000))))
================================================
FILE: benchmarks/bench.07.jsonnet
================================================
local f2(f) = function(x) f(f(x));
local id(x) = x;
local slowId = std.makeArray(20, function(i) if i == 0 then id else f2(slowId[i - 1]));
slowId[15](42)
================================================
FILE: benchmarks/bench.08.jsonnet
================================================
local fibnext = {
a: super.a + super.b,
b: super.a,
};
local fib(n) =
if n == 0 then
{ a: 1, b: 1 }
else
fib(n - 1) + fibnext;
fib(25)
================================================
FILE: benchmarks/bench.09.jsonnet
================================================
// This string must be longer than max stack frames
local veryLongString = std.join('', std.repeat(['e'], 510));
std.assertEqual(std.stripChars(veryLongString + 'ok' + veryLongString, 'e'), 'ok') &&
std.assertEqual(std.lstripChars(veryLongString + 'ok', 'e'), 'ok') &&
std.assertEqual(std.rstripChars('ok' + veryLongString, 'e'), 'ok') &&
true
================================================
FILE: benchmarks/gen_big_object.jsonnet
================================================
local n = 2000;
local objLocal(name, body) = 'local ' + name + ' = ' + body + ',';
local objField(name, body) = name + ': ' + body + ',';
local allLocals =
std.makeArray(n, function(i) objLocal('l' + i, '1'));
local allFields =
std.makeArray(n, function(i) objField('f' + i, '2'));
local indent = ' ';
local indentAndSeparate(s) = indent + s + '\n';
local objContents = std.map(indentAndSeparate, allLocals + allFields);
local objectBody = std.join('', objContents);
'{\n' + objectBody + '}\n'
================================================
FILE: benchmarks/regen_benchmarks.sh
================================================
#!/usr/bin/env bash
set -e
set -x
../jsonnet -S gen_big_object.jsonnet > bench.05.gen.jsonnet
for i in *.gen.jsonnet; do
../jsonnet fmt -i "$i"
done
================================================
FILE: case_studies/fractal/.gitignore
================================================
*.packer.log
*.packer.done
*.packer.json
terraform.done
terraform.plan
service.list
*.tf
service_account_key.json
tilegen/mandelbrot
credentials.libsonnet
================================================
FILE: case_studies/fractal/appserv/main.py
================================================
# Copyright 2015 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Frontend for Fractal demo.
Application server for a 3 tier web app. Submits fractal image generation
requests. Manages metadata database. Renders pages with Jinja2.
"""
import datetime
import json
import os
import sys
import time
import uuid
import flask
import httplib2
import jinja2
from cassandra.auth import PlainTextAuthProvider
from cassandra.cluster import Cluster
from cassandra.cluster import NoHostAvailable
CONF = None
for i in xrange(1, 60):
try:
with open('conf.json') as conf_file:
CONF = json.load(conf_file)
except IOError:
time.sleep(1)
if CONF == None:
sys.stderr.write('ERROR: Could not open conf.json.')
sys.exit(1)
class DbError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
session = None
app = flask.Flask(__name__)
app.config['PROPAGATE_EXCEPTIONS'] = True
JINJA_ENVIRONMENT = jinja2.Environment(
loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
extensions=['jinja2.ext.autoescape'],
autoescape=True)
def render_error(code, msg):
return flask.make_response(my_render_template('error.html', code=code, msg=msg), code)
def db_execute(s, t=()):
global session
if session == None:
try:
ap = PlainTextAuthProvider(username=CONF['database_user'],
password=CONF['database_pass'])
cluster = Cluster(CONF['db_endpoints'], auth_provider=ap)
session = cluster.connect()
session.set_keyspace(CONF['database_name'])
return session.execute(s, t)
except NoHostAvailable:
session = None
raise DbError("Unable to contact database backend.")
else:
try:
return session.execute(s, t)
except NoHostAvailable:
session = None
return db_execute(s, t)
def my_render_template(filename, **context):
context.update(CONF)
return flask.render_template(filename, **context)
def db_clear():
db_execute('TRUNCATE discoveries;')
def db_partition(dt):
#return "%04d-%02d-%02d" % (dt.year, dt.month, dt.day)
return "FIXED"
def db_remember(text, x, y, level):
u = uuid.uuid1()
dt = datetime.datetime.fromtimestamp((u.time - 0x01b21dd213814000L)*100/1e9)
db_execute("INSERT INTO discoveries (Date, TimeId, X, Y, L, Text)"
+ " VALUES (%s, %s, %s, %s, %s, %s)",
(db_partition(dt), u, x, y, level, text))
def db_list():
latest = []
# Keep executing calls until we find 10 or we reach 2013
day_counter = datetime.datetime.now()
last_partition = None
while len(latest) < 10 and day_counter >= datetime.datetime(2013, 1, 1):
curr_partition = db_partition(day_counter)
if last_partition != curr_partition:
last_partition = curr_partition
q = "SELECT * FROM discoveries WHERE Date = '%s' ORDER BY TimeId DESC limit 10;"
rows = db_execute(q % curr_partition)
for row in rows:
u = row[1]
dt = datetime.datetime.fromtimestamp((u.time - 0x01b21dd213814000L)*100/1e9)
latest += [
{'text': row[3], 'x': row[4], 'y': row[5], 'l': row[2], 'ts': dt.isoformat()}
]
day_counter -= datetime.timedelta(1)
return latest
@app.route("/")
def default_handler():
return my_render_template('page.html')
@app.route("/clear_db")
def cleardb_handler():
try:
db_clear()
return 'Done'
except DbError as dbe:
return render_error(500, "Internal error: " + dbe.msg)
@app.route("/remember", methods=['POST'])
def remember_handler():
try:
j = flask.request.json
x = j['x']
y = j['y']
level = j['l']
text = j['text'][:50]
if x < -2: x = -2
if x > 2: x = 2
if y < -2: y = -2
if y > 2: y = 2
if level < 0: level = 0
if level > 50: level = 50
db_remember(text, x, y, level)
return 'Done'
except DbError as dbe:
return render_error(500, "Internal error: " + dbe.msg)
@app.route("/remembered_list")
def remembered_list_handler():
try:
latest = db_list()
return flask.jsonify(latest=latest)
except DbError as dbe:
return render_error(500, "Internal error: " + dbe.msg)
@app.errorhandler(404)
def error_404(error):
return render_error(404, 'Nothing at this URL.')
@app.errorhandler(500)
def error_500(error):
return render_error(500, 'Internal error')
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
================================================
FILE: case_studies/fractal/appserv/static/style.css
================================================
html {
height: 100%;
}
body {
font-family: sans-serif;
height: 100%;
margin: 0;
padding: 0;
background-color: #112;
color: #ccc;
font-family: Arial, Helvetica, sans-serif;
}
a {
color: #fff;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
a:visited {
text-decoration: none;
}
div#left {
float: left;
width: 350px;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
p#banner {
padding: 24px 30px 0px 30px;
font-size: 36pt;
font-weight: bold;
margin: 0;
text-align: center;
}
p#instructions {
margin: 0;
padding: 12px 16px 0 16px;
text-align: justify;
}
div#discoveries {
height: 100%;
margin: 0;
padding: 16px;
}
div#discoveries h1 {
margin: 12px 0 0 0;
font-size: 1.5em;
}
ul#remembered_list {
list-style-type:none;
padding: 0;
margin: 0;
}
a.remembered {
text-decoration: none;
}
li.remembered {
overflow: hidden;
margin: 4px;
}
img.remembered {
float: left;
border-width: 1px;
border-style: solid;
border-color: #444;
margin-right: 16px;
}
p.remembered {
margin: 0;
padding: 8px;
font-size: 11pt;
word-wrap:break-word;
width: 210px;
float: left;
}
div.remembered_date {
position: relative;
}
span.remembered_date {
float: right;
color: #444;
font-size: 10pt;
position: absolute;
right: 0;
top: 44px;
}
div#remember_plus {
margin: 8px 4px;
overflow: hidden;
}
div#remember_plus_text {
float: left;
border-style: solid;
border-width: 1px;
border-color: #444;
margin-right: 16px;
}
p#remember_plus {
margin: 8px;
font-size: 32pt;
text-align: center;
}
textarea#remember_plus_input {
padding: 8px;
font-size: 11pt;
resize: none;
background-color: inherit;
color: #fff;
border: none;
font-family: inherit;
width: 210px;
}
div#right {
background-color: #002;
height: 100%;
max-height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
div#fimg_inside {
padding: 0;
margin: 0;
overflow: hidden;
position: relative;
}
img.fimg {
float: left;
padding: 0;
margin: 0;
/*
outline: 1px solid #f00;
outline-offset: -1px;
*/
}
div#err_box {
padding: 16px;
}
================================================
FILE: case_studies/fractal/appserv/templates/base.html
================================================
<!doctype html public "-//w3c//dtd xhtml 1.0 strict//en"
"http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
<html>
<head>
<title>Mandelbrot Viewer</title>
<link rel=stylesheet type=text/css href="/static/style.css" />
</head>
<body>
<div id=left>
<p id=banner>
Mandelbrot Set Viewer
</p>
<p id=instructions>
{% block instructions %}
{% endblock %}
</p>
<div id=discoveries>
{% block discoveries %}
{% endblock %}
</div>
</div>
<div id=right>
{% block page %}
{% endblock %}
</div>
</body>
</html>
================================================
FILE: case_studies/fractal/appserv/templates/error.html
================================================
{% extends "base.html" %}
{% block page %}
<div id=err_box>
<h1>ERROR: {{ code }}</h1>
<p>{{ msg }}</p>
</div>
{% endblock %}
================================================
FILE: case_studies/fractal/appserv/templates/page.html
================================================
{% extends 'base.html' %}
{% block instructions %}
The <a href="https://en.wikipedia.org/wiki/Mandelbrot_set">Mandelbrot set</a> is a beautiful
fractal popularized by <a href="https://en.wikipedia.org/wiki/Benoit_Mandelbrot">Benoit
Mandelbrot</a>. Explore it by clicking to zoom in, and shift+clicking to zoom out. Take a look at
other peoples' discoveries below, or add your own!
{% endblock %}
{% block discoveries %}
<h1>Recent Discoveries</h1>
<div id=remember_plus>
<a href="javascript:void(0);" onclick="remember();">
<div id=remember_plus_text style="width: {{ thumb_width }}px; height: {{ thumb_height }}px;">
<p id=remember_plus> + </p>
</div>
</a>
<textarea id=remember_plus_input rows="2" cols="20" maxlength=50 placeholder="Please enter description..."></textarea>
</div>
<ul id=remembered_list>
</ul>
{% endblock %}
{% block page %}
<div id=fimg_inside onmousedown='fractal_click(event)'> </div>
<script>
var level = 0;
var cx = 0;
var cy = 0;
var min_x = -1;
var max_x = 1;
var min_y = -1;
var max_y = 1;
var min_cell_x = -1;
var max_cell_x = 1;
var min_cell_y = -1;
var max_cell_y = 1;
function refresh_fimgs() {
var div = document.getElementById('right');
var width = div.offsetWidth;
var height = div.offsetHeight;
var scaled_width = width / {{ width }};
var scaled_height = height / {{ height }};
var scaled_x = cx * Math.pow(2, level);
var scaled_y = cy * Math.pow(2, level);
min_x = scaled_x - width / {{ width }} / 2;
min_y = scaled_y - height / {{ height }} / 2;
max_x = scaled_x + width / {{ width }} / 2;
max_y = scaled_y + height / {{ height }} / 2;
min_cell_x = Math.floor(min_x);
max_cell_x = Math.ceil(max_x);
min_cell_y = Math.floor(min_y);
max_cell_y = Math.ceil(max_y);
var cells_wide = max_cell_x - min_cell_x;
var cells_high = max_cell_y - min_cell_y;
var grid_width = cells_wide * {{ width }};
var grid_height = cells_high * {{ height }};
var offset_left = (min_cell_x - min_x) * {{ width }};
var offset_top = (max_cell_y - max_y) * {{ height }};;
var str = '';
for (var y=max_cell_y-1 ; y>=min_cell_y ; --y) {
for (var x=min_cell_x ; x<max_cell_x ; ++x) {
var url = 'http://{{ tilegen }}/?l=' + level + '&y=' + y + '&x=' + x;
str += '<img width={{ width }} height={{ height }} class=fimg src=' + url + '>';
}
}
var inside = document.getElementById('fimg_inside');
inside.style.width = grid_width + "px";
inside.style.height = grid_height + "px";
inside.style.left = offset_left + "px";
inside.style.top = -offset_top + "px";
inside.innerHTML = str;
}
window.onresize = refresh_fimgs;
refresh_fimgs();
function fractal_click(e) {
e = e || window.event;
if (e.which != 1) return false;
var right = document.getElementById('right');
var click_div = document.getElementById('fimg_inside');
var img_x = 0;
var img_y = 0;
var div = click_div
do {
img_x += div.offsetLeft;
img_y += div.offsetTop;
div = div.offsetParent;
} while (div);
var PosX, PosY;
if (e.pageX || e.pageY) {
PosX = e.pageX;
PosY = e.pageY;
} else if (e.clientX || e.clientY) {
PosX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
PosY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
} else {
PosX = 0;
PosY = 0;
}
PosX -= img_x;
PosY -= img_y;
// Range between 0 and 1
PosX /= click_div.offsetWidth;
PosY /= click_div.offsetHeight;
// Flip it, because in the browser, (0,0) is in the top left
PosY = 1 - PosY;
// Sometimes these are off
if (PosX < 0 || PosY < 0) return false;
if (PosX > 1 || PosY > 1) return false;
PosX = PosX * max_cell_x + (1 - PosX) * min_cell_x;
PosY = PosY * max_cell_y + (1 - PosY) * min_cell_y;
PosX /= Math.pow(2, level);
PosY /= Math.pow(2, level);
cx = PosX;
cy = PosY;
level = e.shiftKey ? level - 1 : level + 1;
if (level <= 0) {
cx = 0;
cy = 0;
level = 0;
}
if (level > 50) {
level = 50;
}
refresh_fimgs();
return true;
}
var server_json = [ ];
function remember() {
var input = document.getElementById('remember_plus_input');
var item = {
"x": cx,
"y": cy,
"l": level,
"ts": new Date().toISOString(),
"text": input.value,
};
if (item.text.length == 0) {
alert('Please write a short description first.');
} else {
server_json.unshift(item);
update_list();
input.value = "";
var http_request = new XMLHttpRequest();
http_request.open("POST", "/remember", true);
http_request.setRequestHeader("Content-type", "application/json");
http_request.send(JSON.stringify(item));
}
}
function leading_zero(n) {
if (n < 10) {
return "0" + n;
} else {
return n;
}
}
function pretty_date(d) {
var m_names = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
"Aug", "Sep", "Oct", "Nov", "Dec");
return leading_zero(d.getHours())
+ ":" + leading_zero(d.getMinutes())
+ ":" + leading_zero(d.getSeconds())
+ ", " + m_names[d.getMonth()] + " " + d.getDate() + " " + d.getFullYear();
}
function update_list() {
var div = document.getElementById('remembered_list');
var str = '';
if (server_json == null) {
str = "<p class=remembered>Database error.</p>";
} else {
for (var i in server_json) {
var item = server_json[i];
var url = 'http://{{ tilegen }}/thumb?l=' + item.l + '&y=' + item.y + '&x=' + item.x;
// Hack to escape HTML
var tmp = document.createElement("DIV");
tmp.innerText = item.text;
var text = tmp.innerHTML;
var link = 'cx='+item.x+'; cy='+item.y+'; level='+item.l+'; refresh_fimgs()';
str += '<a onclick="' + link + '" href="javascript:void(0);">'
+ '<li class=remembered>'
+ '<img class=remembered src="'
+ url
+ '" style="width: {{ thumb_width }}px; height: {{ thumb_height }}px"/>'
+ '<p class=remembered>' + text + '</p>'
+ '<div class=remembered_date>'
+ '<span class=remembered_date>' + pretty_date(new Date(item.ts)) + '</span>'
+ '</div>'
+ '</li>'
+ '</a>\n';
}
}
div.innerHTML = str;
}
function request_list() {
var http_request = new XMLHttpRequest();
http_request.onreadystatechange = function() {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
server_json = JSON.parse(http_request.responseText).latest;
} else {
server_json = null;
}
update_list();
}
}
http_request.open('GET', '/remembered_list', true);
http_request.send();
}
//update_list();
request_list();
-->
</script>
{% endblock %}
================================================
FILE: case_studies/fractal/credentials.libsonnet.TEMPLATE
================================================
{
project: "XXXXXXXX", // GCP project name (e.g. verbing-noun-123)
cassandraUserPass: "XXXXXXXX", // Any valid Cassandra password (e.g. numbers, letters, capitals)
cassandraRootPass: "XXXXXXXX", // Any other valid Cassandra password (e.g. numbers, letters, capitals)
dnsPrefix: "", // Change to differentiate one deployment of Fractal from another.
}
================================================
FILE: case_studies/fractal/lib/cassandra.libsonnet
================================================
/*
Copyright 2015 Google Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
local packer = import "packer.libsonnet";
{
local cassandra = self,
// The default Cassandra configuration. Override what you want to change.
conf:: {
authenticator: "AllowAllAuthenticator",
authorizer: "AllowAllAuthorizer",
auto_snapshot: true,
batch_size_warn_threshold_in_kb: 5,
batchlog_replay_throttle_in_kb: 1024,
cas_contention_timeout_in_ms: 1000,
client_encryption_options: {
enabled: false,
keystore: "conf/.keystore",
keystore_password: "cassandra",
},
cluster_name: "Unnamed Cluster",
column_index_size_in_kb: 64,
commit_failure_policy: "stop",
commitlog_directory: "/var/lib/cassandra/commitlog",
commitlog_segment_size_in_mb: 32,
commitlog_sync: "periodic",
commitlog_sync_period_in_ms: 10000,
compaction_throughput_mb_per_sec: 16,
concurrent_counter_writes: 32,
concurrent_reads: 32,
concurrent_writes: 32,
counter_cache_save_period: 7200,
counter_cache_size_in_mb: null,
counter_write_request_timeout_in_ms: 5000,
cross_node_timeout: false,
data_file_directories: ["/var/lib/cassandra/data"],
disk_failure_policy: "stop",
dynamic_snitch_badness_threshold: 0.1,
dynamic_snitch_reset_interval_in_ms: 600000,
dynamic_snitch_update_interval_in_ms: 100,
endpoint_snitch: "SimpleSnitch",
hinted_handoff_enabled: true,
hinted_handoff_throttle_in_kb: 1024,
incremental_backups: false,
index_summary_capacity_in_mb: null,
index_summary_resize_interval_in_minutes: 60,
inter_dc_tcp_nodelay: false,
internode_compression: "all",
key_cache_save_period: 14400,
key_cache_size_in_mb: null,
listen_address: "localhost",
max_hint_window_in_ms: 10800000,
max_hints_delivery_threads: 2,
memtable_allocation_type: "heap_buffers",
native_transport_port: 9042,
num_tokens: 256,
partitioner: "org.apache.cassandra.dht.Murmur3Partitioner",
permissions_validity_in_ms: 2000,
range_request_timeout_in_ms: 10000,
read_request_timeout_in_ms: 5000,
request_scheduler: "org.apache.cassandra.scheduler.NoScheduler",
request_timeout_in_ms: 10000,
row_cache_save_period: 0,
row_cache_size_in_mb: 0,
rpc_address: "localhost",
rpc_keepalive: true,
rpc_port: 9160,
rpc_server_type: "sync",
saved_caches_directory: "/var/lib/cassandra/saved_caches",
seed_provider: [
{
class_name: "org.apache.cassandra.locator.SimpleSeedProvider",
parameters: [{ seeds: "127.0.0.1" }],
},
],
server_encryption_options: {
internode_encryption: "none",
keystore: "conf/.keystore",
keystore_password: "cassandra",
truststore: "conf/.truststore",
truststore_password: "cassandra",
},
snapshot_before_compaction: false,
ssl_storage_port: 7001,
sstable_preemptive_open_interval_in_mb: 50,
start_native_transport: true,
start_rpc: true,
storage_port: 7000,
thrift_framed_transport_size_in_mb: 15,
tombstone_failure_threshold: 100000,
tombstone_warn_threshold: 1000,
trickle_fsync: false,
trickle_fsync_interval_in_kb: 10240,
truncate_request_timeout_in_ms: 60000,
write_request_timeout_in_ms: 2000,
},
// Some firewall resources to open up Cassandra ports.
GcpFirewall:: {
cassandraTag:: "cassandra-server",
source_ranges: ["0.0.0.0/0"],
network: error "cassandra.GcpFirewall must have field: network",
allow: { protocol: "tcp", ports: ["9042", "9160"] },
// From the Internet to these ports.
target_tags: [self.cassandraTag],
},
GcpFirewallGossip:: {
cassandraTag:: "cassandra-server",
source_ranges: ["0.0.0.0/0"],
network: error "cassandra.GcpFirewallGossip must have field: network",
allow: { protocol: "tcp", ports: ["7000", "7001", "7199"] },
// From these machines amongst themselves.
source_tags: [self.cassandraTag],
target_tags: [self.cassandraTag],
},
// Sets the root password to something, while the server is listening only on localhost.
GcpDebianImage: packer.GcpDebianImage {
local image = self,
rootPassword:: error "GcpDebianCassandraPrimedImage: must have field: rootPassword",
clusterName:: error "GcpDebianCassandraPrimedImage: must have field: clusterName",
aptKeyUrls+: ["https://www.apache.org/dist/cassandra/KEYS"],
aptRepoLines+: {
cassandra: "deb https://www.apache.org/dist/cassandra/debian 21x main",
},
aptPackages+: ["cassandra"],
conf:: cassandra.conf {
authenticator: "PasswordAuthenticator",
cluster_name: image.clusterName,
},
provisioners+: [
packer.RootShell {
inline: [
// Shut it down
"/etc/init.d/cassandra stop",
// Remove junk from unconfigured startup
"rm -rfv /var/lib/cassandra/*",
// Enable authentication
local dest = "/etc/cassandra/cassandra.yaml";
"echo %s > %s" % [std.escapeStringBash("" + image.conf), dest],
// Start it up again
"/etc/init.d/cassandra start",
// Wait for it to be ready
cassandra.waitForCqlsh("cassandra", "cassandra", "localhost"),
// Set root password
local cql = "ALTER USER cassandra WITH PASSWORD '%s';" % image.rootPassword;
"echo %s | cqlsh -u cassandra -p cassandra" % std.escapeStringBash(cql),
],
},
],
},
// A line of bash that will wait for a Cassandra service to be "up".
waitForCqlsh(user, pass, host)::
"while ! echo show version | cqlsh -u %s -p %s %s ; do sleep 1; done" % [user, pass, host],
// A line of bash that will wait for the given port to accept connections.
waitForSeed(host, port)::
"while ! nc %s %d < /dev/null; do sleep 1; done" % [host, port],
// This mixin is intended to be used on a Google Cloud Platform Instance based on the above
// GcpDebianImage. It adds commands to the startup script that bootstrap Cassandra using a
// given CQL script and configuration.
GcpStarterMixin: {
startup_script+: [
// Wait for the misconfigured cassandra to start up.
cassandra.waitForCqlsh("cassandra", self.rootPass, "localhost"),
// Set up system_auth replication level
"echo %s | cqlsh -u cassandra -p %s localhost"
% [std.escapeStringBash("ALTER KEYSPACE system_auth WITH REPLICATION = %s;"
% self.authReplication),
self.rootPass],
// Drop in the correct configuration.
"echo %s > %s"
% [std.escapeStringBash("" + self.conf), "/etc/cassandra/cassandra.yaml"],
// Restart with new configuration.
"/etc/init.d/cassandra restart",
// Wait for the properly configured cassandra to start up and reach quorum.
cassandra.waitForCqlsh("cassandra", self.rootPass, "$HOSTNAME"),
// Set up users, empty tables, etc.
"echo %s | cqlsh -u cassandra -p %s $HOSTNAME"
% [std.escapeStringBash(std.lines(self.initCql)), self.rootPass],
],
},
// This mixin is intended to be used on a Google Cloud Platform Instance based on the above
// GcpDebianImage. It adds commands to the startup script that bootstrap Cassandra by wiping
// its slate clean and allowing it to join an existing cluster.
GcpTopUpMixin: {
startup_script+: [
// Wait for the misconfigured cassandra to start up.
cassandra.waitForCqlsh("cassandra", self.rootPass, "localhost"),
// Kill it.
"/etc/init.d/cassandra stop",
// Clean up the mess it caused due to being misconfigured.
"rm -rf /var/lib/cassandra/*",
// Drop in the correct configuration.
"echo %s > %s"
% [std.escapeStringBash("" + self.conf), "/etc/cassandra/cassandra.yaml"],
// Start it up again.
"/etc/init.d/cassandra start",
],
},
}
================================================
FILE: case_studies/fractal/lib/packer.libsonnet
================================================
/*
Copyright 2015 Google Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
{
local packer = self,
// A Packer shell provisioner to run something as root.
RootShell:: {
type: "shell",
execute_command: "{{ .Vars }} sudo -E /bin/bash '{{ .Path }}'",
},
// A Packer shell provisioner to run something as the current user.
Shell:: {
type: "shell",
},
// A Packer file provisioner.
File:: {
type: "file",
destination: error "File requires field: destination",
source: error "File requires field: source",
},
// A Packer provisioner that creates a file from inline content, with the given permissions.
EnsureFile:: packer.RootShell {
content:: error "EnsureFile provisioner must have field content",
destination:: error "EnsureFile provisioner must have field destination",
permissions:: "644",
user:: "root",
group:: self.user,
environment_vars: [
// TODO(dcunnin): escaping bash is a workaround for Packer #1733
"PACKER_EXPLICIT_FILE_CONTENT='%s'" % std.escapeStringBash(self.content),
"PACKER_EXPLICIT_FILE=" + self.destination,
],
inline: [
"mkdir -v -p \"$(dirname \"$PACKER_EXPLICIT_FILE\")\"",
"echo \"Creating file: $PACKER_EXPLICIT_FILE\"",
"echo -n \"$PACKER_EXPLICIT_FILE_CONTENT\" > \"$PACKER_EXPLICIT_FILE\"",
"chmod -v %s \"$PACKER_EXPLICIT_FILE\"" % [self.permissions],
"chown -v %s.%s \"$PACKER_EXPLICIT_FILE\"" % [self.user, self.group],
],
},
// A Packer provisioner that creates a directory with given permissions.
EnsureDir:: packer.RootShell {
dir:: error "EnsureDir provisioner must have field dir",
permissions:: "775",
user:: "root",
group:: self.user,
environment_vars: [
"PACKER_DIR=" + self.dir,
],
inline: [
"mkdir -pv \"$PACKER_DIR\"",
"chmod -v %s \"$PACKER_DIR\"" % [self.permissions],
"chown -v %s.%s \"$PACKER_DIR\"" % [self.user, self.group],
],
},
// A Packer provisioner that creates a symlink.
EnsureSymLink:: packer.RootShell {
from:: error "EnsureSymLink provisioner must have field: from",
to:: error "EnsureSymLink provisioner must have field: to",
environment_vars: [
"PACKER_SYM_FROM=" + self.from,
"PACKER_SYM_TO=" + self.to,
],
inline: [
"ln -sfv \"$PACKER_SYM_FROM\" \"$PACKER_SYM_TO\"",
],
},
// A Packer provisioner to install Python packages via Pip. Pip must already be installed. The
// packages are given as an array of strings.
Pip:: packer.RootShell {
packages:: error "Pip provisioner must have field: packages",
inline: ["pip install " + std.join(" ", self.packages)],
},
// A Packer provisioner to install Apt packages. This provisioner can be configured with
// additional keys and repositories. The packages are given as an array of strings.
Apt:: packer.RootShell {
packages:: error "Apt provisioner must have field: packages",
keyUrls:: [],
// { foo: "..." } will add a foo.list containing the given content.
repoLines:: {},
// { foo: "..." } will add a foo.list fetched from the given URL.
repoUrls:: {},
keyCommands:: ["curl --silent %s | apt-key add -" % [url] for url in self.keyUrls],
local dir = "/etc/apt/sources.list.d",
local repoLineCommands = ["echo \"%s\" > %s/%s.list" % [self.repoLines[k], dir, k]
for k in std.objectFields(self.repoLines)],
local repoUrlCommands = ["curl -o %s/%s.list %s" % [dir, k, self.repoUrls[k]]
for k in std.objectFields(self.repoUrls)],
repoCommands:: repoLineCommands + repoUrlCommands,
local opts = "-o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold",
installCommands:: ["apt-get -qq -y %s install %s" % [opts, std.join(" ", self.packages)]],
environment_vars: ["DEBIAN_FRONTEND=noninteractive"],
inline: self.repoCommands + self.keyCommands
+ ["apt-get -qq -y update"] + self.installCommands,
},
// TODO(dcunnin): yum
/*
# RHEL and CentOS.
rpm -Uvh --quiet "RPM_URL"
yum makecache
yum -q -y install package1 package2 ...
*/
// TODO(dcunnin): zypper
/*
zypper refresh
zypper --non-interactive --quiet install package1 package2 ...
*/
// A template for building an image on Google Cloud Platform. This brings out build attributes
// to the top level and provides defaults for others.
GcpImage:: {
// Override these
name:: error "GcpImage must have field: name",
description: "Packer GcpImage: " + self.name,
source_image:: error "GcpImage must have field: name",
project_id:: error "GcpImage must have field: project_id",
account_file:: error "GcpImage must have field: account_file",
sshUsername:: error "GcpImage must have field: sshUsername",
local img = self,
builder:: {
type: "googlecompute",
name: img.name,
image_name: "%s" % [self.name],
image_description: "GCP builder for " + self.name,
// Project & authentication
project_id: img.project_id,
account_file: img.account_file,
// Instance mechanics
machine_type: "n1-standard-1", // Multicore probably doesn't provide any benefit
source_image: img.source_image,
instance_name: "packer-" + self.name,
zone: "us-central1-a",
ssh_username: img.sshUsername,
[if std.objectHas(img, "disk_size") then "disk_size"]: img.disk_size,
},
builders: [self.builder],
provisioners: [],
},
// A template for building a Debian image on Google Cloud Platform. This allows specifying apt
// and pip attributes at the top-level and automatically provisions the desired packages.
GcpDebianImage:: packer.GcpImage {
local image = self,
source_image: "backports-debian-7-wheezy-v20141017",
local pip_pkgs = self.aptPackages
+ if std.length(self.pipPackages) == 0 then [] else ["python-pip"],
aptPackages:: [],
aptKeyUrls:: [],
aptRepoLines:: {},
aptRepoUrls:: {},
pipPackages:: [],
local apt_provisioners =
if std.length(pip_pkgs) == 0
&& std.length(self.aptKeyUrls) == 0
&& std.length(self.aptRepos) == 0 then [
] else [
packer.Apt {
packages: pip_pkgs,
keyUrls: image.aptKeyUrls,
repoLines: image.aptRepoLines,
repoUrls: image.aptRepoUrls,
},
],
local pip_provisioners =
if std.length(self.pipPackages) == 0 then [
] else [
packer.Pip { packages: image.pipPackages },
],
provisioners+: apt_provisioners + pip_provisioners,
},
// A template for building Nginx/uwsgi/flask based application servers. The uwsgi configuration
// is provided at the top level and is automatically compiler to INI format. A simple cron line
// is used to start the uwsgi emperor at boot. The given Flask module must exist in /var/www,
// so extend this template with additional provisioners to create that content.
GcpDebianNginxUwsgiFlaskImage:: packer.GcpDebianImage {
local image = self,
module:: error "NginxUwsgiFlaskImage must have field: module",
application:: "app",
port:: 80,
uwsgiSocket:: "/var/www/uwsgi.sock",
aptPackages+: ["nginx", "python-dev"],
pipPackages+: ["flask", "uwsgi"],
uwsgiConf:: {
chdir: "/var/www",
base: "/var/www",
module: image.module,
pythonpath: "/var/www",
socket: image.uwsgiSocket,
"chmod-socket": "644",
callable: image.application,
logto: "/var/log/uwsgi/uwsgi.log",
},
nginxConf:: [
"server {",
" listen %d;" % image.port,
" server_name localhost;",
" charset utf-8;",
" client_max_body_size 75M;",
" location / { try_files $uri @yourapplication; }",
" location @yourapplication {",
" include uwsgi_params;",
" uwsgi_pass unix:%s;" % image.uwsgiSocket,
" }",
"}",
],
provisioners+: [
packer.RootShell { inline: ["rm /etc/nginx/sites-enabled/default"] },
packer.EnsureFile {
destination: "/etc/nginx/conf.d/frontend_nginx.conf",
content: std.lines(image.nginxConf),
},
packer.EnsureFile {
destination: "/etc/uwsgi/vassals/uwsgi.ini",
content: std.manifestIni({
sections: {
uwsgi: image.uwsgiConf,
},
}),
},
packer.EnsureFile {
destination: "/etc/cron.d/emperor",
content: "@reboot root /usr/local/bin/uwsgi --master --emperor /etc/uwsgi/vassals "
+ "--daemonize /var/log/uwsgi/emperor.log --pidfile /var/run/uwsgi.pid "
+ "--die-on-term --uid www-data --gid www-data\n",
},
packer.EnsureDir { dir: "/var/log/uwsgi", user: "www-data" },
packer.EnsureDir { dir: "/var/www", user: "www-data" },
],
},
// A template to help build PostgreSQL images (experimental).
GcpDebianPostgresqlImage: packer.GcpDebianImage {
local image = self,
rootPassword:: error "GcpDebianPostgresqlImage: must have field: rootPassword",
aptPackages+: ["postgresql", "postgresql-contrib"],
initSql:: [
"ALTER USER POSTGRES WITH PASSWORD '%s';" % image.rootPassword,
],
provisioners+: [
packer.RootShell { inline: [
"echo %s | sudo -u postgres psql" % std.escapeStringBash(std.lines(image.initSql)),
] },
packer.EnsureFile {
destination: "/etc/postgresql/9.1/main/postgresql.conf",
content: std.lines([
"data_directory = '/var/lib/postgresql/9.1/main'",
"hba_file = '/etc/postgresql/9.1/main/pg_hba.conf'",
"ident_file = '/etc/postgresql/9.1/main/pg_ident.conf'",
"external_pid_file = '/var/run/postgresql/9.1-main.pid'",
"listen_addresses = '*'",
"port = 5432",
"max_connections = 100",
"unix_socket_directory = '/var/run/postgresql'",
"ssl = true",
"shared_buffers = 32MB",
"log_line_prefix = '%t '",
"datestyle = 'iso, mdy'",
"lc_messages = 'en_US.UTF-8'",
"lc_monetary = 'en_US.UTF-8'",
"lc_numeric = 'en_US.UTF-8'",
"lc_time = 'en_US.UTF-8'",
"default_text_search_config = 'pg_catalog.english'",
]),
},
packer.EnsureFile {
destination: "/etc/postgresql/9.1/main/pg_hba.conf",
content: std.lines([
"local all all md5",
"host all all 255.255.255.255/0 md5",
"host all all ::1/128 md5",
]),
},
],
},
// A template to help build MySQL images (experimental).
GcpDebianMysqlImage: packer.GcpDebianImage {
local image = self,
rootPassword:: error "GcpDebianMysqlImage: must have field: rootPassword",
aptPackages+: ["mysql-server"],
initSql:: [],
provisioners+: [
packer.RootShell { inline: [
"mysqladmin -u root password '%s'" % std.escapeStringBash(image.rootPassword),
"echo %s | mysql -u root --password=%s"
% [std.escapeStringBash(std.lines(image.initSql)),
std.escapeStringBash(image.rootPassword)],
] },
packer.EnsureFile {
destination: "/etc/mysql/conf.d/local.cnf",
content: std.manifestIni({
sections: {
mysqld: {
"bind-address": "0.0.0.0",
},
},
}),
},
],
},
}
================================================
FILE: case_studies/fractal/lib/terraform.libsonnet
================================================
/*
Copyright 2015 Google Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
{
local terraform = self,
// Basic template for a GCP instance, adds default service account scopes, and factors out a few
// things into top-level fields.
GcpInstance:: {
local instance = self,
name: error "Instance must have field: name",
image:: error "Instance must have field: image",
address:: null,
scopes:: ["devstorage.read_only", "logging.write"],
service_account: [
{
scopes: ["https://www.googleapis.com/auth/" + s for s in instance.scopes],
},
],
machine_type: "f1-micro",
zone: "us-central1-f",
tags: ["terraform"],
disk: {
image: instance.image,
},
startup_script:: [],
addFile(v, dest)::
"echo %s > %s" % [std.escapeStringBash(v), std.escapeStringBash(dest)],
metadata: {
"startup-script": std.lines(instance.startup_script),
},
network_interface: [{
network: "default",
access_config: if instance.address != null then [
{ nat_ip: instance.address },
] else [
{},
],
}],
},
// Allow http for servers tagged with "http-server" on the given network.
GcpFirewallHttp:: {
local fw = self,
source_ranges: ["0.0.0.0/0"],
port:: 80,
network: error "GcpFirewallHttp must have field: network",
allow: [{ protocol: "tcp", ports: [std.toString(fw.port)] }],
target_tags: ["http-server"],
},
// Allow ssh for all servers on the given network.
GcpFirewallSsh:: {
source_ranges: ["0.0.0.0/0"],
network: error "GcpFirewallSsh must have field: network",
allow: [{ protocol: "tcp", ports: ["22"] }],
},
}
================================================
FILE: case_studies/fractal/service.jsonnet
================================================
/*
Copyright 2015 Google Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Import some libraries
local packer = import "packer.libsonnet";
local terraform = import "terraform.libsonnet";
local cassandra = import "cassandra.libsonnet";
// Credentials file (don't commit this!)
local credentials = import "credentials.libsonnet";
function(ssh_username) {
///////////////////////////
// GENERAL CONFIGURATION //
///////////////////////////
local tilegenPort = 8080,
local cassandraUser = "fractal", // Password in credentials import.
local cassandraKeyspace = "fractal",
local cassandraReplication = "{ 'class' : 'SimpleStrategy', 'replication_factor' : 2 }",
// These are the nodes the application server attempts to use (client-side load balancing).
local cassandraNodes = ["db1", "db2", "db3", "db4", "db5"],
// The Cassandra configuration file we use for this service.
local cassandraConf = cassandra.conf {
cluster_name: "Fractal Cluster",
rpc_address:: null, // Unset by making it hidden (::).
listen_address:: null, // Unset by making it hidden (::).
authenticator: "PasswordAuthenticator",
seed_provider: [
{
class_name: "org.apache.cassandra.locator.SimpleSeedProvider",
parameters: [{ seeds: std.join(", ", cassandraNodes) }],
},
],
},
// Create an initial (empty) database for storing 'discovered' fractal coordinates.
local cql_insert(uuid, x, y, l, n) =
"INSERT INTO discoveries (Date, TimeId, X, Y, L, Text) "
+ ("VALUES ('FIXED', %s, %s, %s, %s, '%s');" % [uuid, x, y, l, n]),
local cassandraInitCql = [
"CREATE USER %s WITH PASSWORD '%s';" % [cassandraUser, credentials.cassandraUserPass],
"CREATE KEYSPACE %s WITH REPLICATION = %s;" % [cassandraKeyspace, cassandraReplication],
"USE %s;" % cassandraKeyspace,
"CREATE TABLE discoveries("
+ "Date TEXT, TimeId TIMEUUID, Text TEXT, X FLOAT, Y FLOAT, L INT, "
+ "PRIMARY KEY(Date, TimeId));",
cql_insert("18063880-5a4d-11e4-ada4-247703d0f194", "0", "0", "0", "Zoomed Out"),
cql_insert("66b6d100-5a53-11e4-aa05-247703d0f194",
"-1.21142578125", "0.3212890625", "4", "Lightning"),
cql_insert("77ffdd80-5a53-11e4-8ccf-247703d0f194",
"-1.7568359375", "-0.0009765625", "5", "Self-similarity"),
cql_insert("7fbf8200-5a53-11e4-804a-247703d0f194",
"0.342529296875", "0.419189453125", "5", "Windmills"),
cql_insert("9ae7bd00-5a66-11e4-9c66-247703d0f194",
"-1.48309979046093", "0.00310595797955671", "39", "Star"),
cql_insert("75fe4480-5a7c-11e4-a747-247703d0f194",
"-0.244976043701172", "0.716987609863281", "10", "Baroque"),
cql_insert("abf70380-5b24-11e4-8a46-247703d0f194",
"-1.74749755859375", "0.009002685546875", "9", "Hairy windmills"),
],
// Configuration shared by the application server and tile generation nodes.
local ApplicationConf = {
width: 256,
height: 256,
thumb_width: 64,
thumb_height: 64,
iters: 200,
database: cassandraKeyspace,
tilegen: "${google_compute_address.tilegen.address}:%d" % tilegenPort,
db_endpoints: cassandraNodes,
},
///////////////////////////
// PACKER CONFIGURATIONS //
///////////////////////////
// Some config used in every Packer image we create.
local ImageMixin = {
project_id: credentials.project,
account_file: "service_account_key.json",
// For debugging:
local network_debug = ["traceroute", "lsof", "iptraf", "tcpdump", "host", "dnsutils"],
aptPackages+: ["vim", "git", "psmisc", "screen", "strace"] + network_debug,
sshUsername: ssh_username,
},
// Frontend image.
"appserv.packer.json": packer.GcpDebianNginxUwsgiFlaskImage + ImageMixin {
name: "appserv-v20150430-2145",
module: "main", // Entrypoint in the Python code.
pipPackages+: ["httplib2", "cassandra-driver", "blist"],
uwsgiConf+: { lazy: "true" }, // cassandra-driver does not survive fork()
// Copy website content and code.
provisioners+: [
packer.File {
source: "appserv",
destination: "/tmp/",
},
packer.RootShell { inline: [
"mv /tmp/appserv/* /var/www/",
"chown -R www-data.www-data /var/www/*",
] },
],
},
// The Cassandra image is basic, but more configuration is done at deployment time.
"cassandra.packer.json": cassandra.GcpDebianImage + ImageMixin {
name: "cassandra-v20150430-2145",
rootPassword: credentials.cassandraRootPass,
clusterName: cassandraConf.cluster_name,
},
// Tile Generation node runs a C++ program to generate PNG tiles for the fractal.
"tilegen.packer.json": packer.GcpDebianNginxUwsgiFlaskImage + ImageMixin {
name: "tilegen-v20150430-2145",
module: "mandelbrot_service",
aptPackages+: ["g++", "libpng-dev"],
port: tilegenPort,
// Copy the flask handlers and also build the C++ executable.
provisioners+: [
packer.File {
source: "tilegen",
destination: "/tmp/",
},
packer.RootShell { inline: [
"mv /tmp/tilegen/* /var/www/",
"chown -R www-data.www-data /var/www/*",
] },
packer.RootShell { inline: [
"g++ -Wall -Wextra -ansi -pedantic -O3 -ffast-math -g "
+ "/var/www/mandelbrot.cpp -lpng -o /var/www/mandelbrot",
] },
],
},
/////////////////////////////
// TERRAFORM CONFIGURATION //
/////////////////////////////
"terraform.tf": {
// How to contact the Google Cloud Platform APIs.
provider: {
google: {
account_file: "service_account_key.json",
project: credentials.project,
region: "us-central1",
},
},
// The deployed resources.
resource: {
// Instances are assigned zones on a round robin scheme.
local zone(hash) =
local arr = [
"us-central1-c",
"us-central1-b",
"us-central1-f",
];
arr[hash % std.length(arr)],
// The internal subnet.
google_compute_network: {
fractal: {
name: "fractal",
ipv4_range: "10.0.0.0/16",
},
},
// Publicly visible static ip addresses.
google_compute_address: {
appserv: { name: "appserv" },
tilegen: { name: "tilegen" },
},
// The next 3 resource types configure load balancing for the appserv and tilegen.
google_compute_http_health_check: {
appserv: {
name: "appserv",
port: 80,
},
tilegen: {
name: "tilegen",
port: tilegenPort,
},
},
google_compute_target_pool: {
appserv: {
name: "appserv",
health_checks: ["${google_compute_http_health_check.appserv.name}"],
instances: ["%s/appserv%d" % [zone(k), k] for k in [1, 2, 3]],
},
tilegen: {
name: "tilegen",
health_checks: ["${google_compute_http_health_check.tilegen.name}"],
instances: ["%s/tilegen%d" % [zone(k), k] for k in [1, 2, 3, 4, 5]],
},
},
google_compute_forwarding_rule: {
appserv: {
ip_address: "${google_compute_address.appserv.address}",
name: "appserv",
target: "${google_compute_target_pool.appserv.self_link}",
port_range: "80",
},
tilegen: {
ip_address: "${google_compute_address.tilegen.address}",
name: "tilegen",
target: "${google_compute_target_pool.tilegen.self_link}",
port_range: tilegenPort,
},
},
// Open ports for the various services, to instances (identified by tags)
google_compute_firewall: {
local NetworkMixin = { network: "${google_compute_network.fractal.name}" },
ssh: terraform.GcpFirewallSsh + NetworkMixin { name: "ssh" },
appserv: terraform.GcpFirewallHttp + NetworkMixin { name: "appserv" },
tilegen: terraform.GcpFirewallHttp + NetworkMixin { name: "tilegen", port: tilegenPort },
cassandra: cassandra.GcpFirewall + NetworkMixin { name: "cassandra" },
gossip: cassandra.GcpFirewallGossip + NetworkMixin { name: "gossip" },
},
// All our instances share this configuration.
local FractalInstance(zone_hash) = terraform.GcpInstance {
network_interface: [super.network_interface[0] { network: "${google_compute_network.fractal.name}" }],
tags+: ["fractal"],
zone: zone(zone_hash),
scopes+: ["devstorage.full_control"],
},
// The various kinds of Cassandra instances all share this basic configuration.
local CassandraInstance(zone_hash) = FractalInstance(zone_hash) {
image: "cassandra-v20150430-2145",
machine_type: "n1-standard-1",
tags+: ["fractal-db", "cassandra-server"],
user:: cassandraUser,
userPass:: credentials.cassandraUserPass,
rootPass:: credentials.cassandraRootPass,
conf:: cassandraConf,
},
google_compute_instance: {
// The application server instances have database credentials and the address of the
// tilegen loadbalancer. This is all stored in a conf.json, read by the python
// code.
["appserv" + k]: FractalInstance(k) {
name: "appserv" + k,
image: "appserv-v20150430-2145",
conf:: ApplicationConf {
database_name: cassandraKeyspace,
database_user: cassandraUser,
database_pass: credentials.cassandraUserPass,
},
tags+: ["fractal-appserv", "http-server"],
startup_script+: [self.addFile(self.conf, "/var/www/conf.json")],
}
for k in [1, 2, 3]
} + {
// Bootstrapping the Cassandra database is a little subtle. We bring up 3 nodes
// in parallel, one of which is special and creates the initial database. The other
// two join it. Note the two different mixins used to control that behavior.
db1: CassandraInstance(1) + cassandra.GcpStarterMixin {
name: "db1",
// Replication of the system_auth table (user credentials).
authReplication:: cassandraReplication,
// The CQL code is used to bootstrap the database.
initCql:: cassandraInitCql,
},
// TopUpMixin creates an empty Cassandra node which can join an existing cluster.
db2: CassandraInstance(2) + cassandra.GcpTopUpMixin {
name: "db2",
},
db3: CassandraInstance(3) + cassandra.GcpTopUpMixin {
name: "db3",
},
// To increase the size of the cluster, these can be used. Bring them up one by one
// verifying the state of the database each time by logging onto an existing db node
// and running "nodetool status fractal". To reduce the size of the cluster, use
// nodetool -h $HOST decommission and then remove the node from this configuration.
// If a node is removed without decommissioning, fix the cluster with nodetool
// removenode <UUID>. It is possible to completely recycle the nodes (including the
// first node) without data loss as long as nodetool is used judiciously.
/*
db4: CassandraInstance(4) + cassandra.GcpTopUpMixin {
name: "db4",
},
*/
} + {
// The tile generation instances are similar to the application server ones, but do
// not require database credentials so these are omitted for security.
["tilegen" + k]: FractalInstance(k) {
name: "tilegen" + k,
image: "tilegen-v20150430-2145",
tags+: ["fractal-tilegen", "http-server"],
startup_script+: [self.addFile(ApplicationConf, "/var/www/conf.json")],
}
for k in [1, 2, 3, 4]
},
google_dns_managed_zone: {
"fractaldemo-com": {
name: "fractaldemo-com",
dns_name: credentials.dnsPrefix + "fractaldemo.com.",
description: "Fractal Demo DNS Zone",
},
},
local instances = self.google_compute_instance,
local addresses = self.google_compute_address,
local DnsRecord = {
managed_zone: "${google_dns_managed_zone.fractaldemo-com.name}",
type: "A",
ttl: 300,
},
google_dns_record_set: {
[name]: DnsRecord {
name: name + ".${google_dns_managed_zone.fractaldemo-com.dns_name}",
rrdatas: ["${google_compute_address." + name + ".address}"],
} for name in std.objectFields(addresses)
} + {
[name]: DnsRecord {
name: name + ".${google_dns_managed_zone.fractaldemo-com.dns_name}",
rrdatas: ["${google_compute_instance." + name + ".network_interface.0.access_config.0.nat_ip}"],
} for name in std.objectFields(instances)
} + {
www: {
managed_zone: "${google_dns_managed_zone.fractaldemo-com.name}",
name: "www.${google_dns_managed_zone.fractaldemo-com.dns_name}",
type: "CNAME",
ttl: 300,
rrdatas: ["appserv.${google_dns_managed_zone.fractaldemo-com.dns_name}"],
},
zone: {
managed_zone: "${google_dns_managed_zone.fractaldemo-com.name}",
name: "${google_dns_managed_zone.fractaldemo-com.dns_name}",
type: "A",
ttl: 300,
rrdatas: ["${google_compute_address.appserv.address}"],
},
},
},
output: {
frontend: { value: "${google_compute_address.appserv.address}" },
},
}, // terraform.tf
}
================================================
FILE: case_studies/fractal/tilegen/mandelbrot.cpp
================================================
/*
Copyright 2015 Google Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>
#include <png.h>
int main(int argc, const char **argv)
{
if (argc != 8) {
std::cerr <<"Usage: <width> <height> <iters> <left> <bottom> <right> <top>" << std::endl;
std::cerr <<"PNG file is written to stdout." << std::endl;
exit(EXIT_FAILURE);
}
unsigned long width = strtoul(argv[1], NULL, 10);
unsigned long height = strtoul(argv[2], NULL, 10);
unsigned long iterations = strtoul(argv[3], NULL, 10);
double left = strtod(argv[4], NULL);
double bottom = strtod(argv[5], NULL);
double right = strtod(argv[6], NULL);
double top = strtod(argv[7], NULL);
struct Exception {
const std::string &msg;
Exception(const std::string &msg) : msg(msg) { }
};
int code = EXIT_SUCCESS;
png_structp png_write_struct = NULL;
volatile png_infop info_ptr = NULL;
try {
png_write_struct = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_write_struct == NULL)
throw Exception("Could not allocate libpng write_struct.");
info_ptr = png_create_info_struct(png_write_struct);
if (info_ptr == NULL)
throw Exception("Could not allocate libpng info_struct.");
if (setjmp(png_jmpbuf(png_write_struct)))
throw Exception("Exception from libpng");
png_init_io(png_write_struct, stdout);
png_set_IHDR(png_write_struct, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB,
PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
png_write_info(png_write_struct, info_ptr);
std::vector<png_byte> row(3 * width);
for (unsigned long y=0 ; y<height ; y++) {
const double scalar_y = double(y) / height;
const double mb_y = scalar_y * bottom + (1-scalar_y) * top; // libpng y==0 is top
for (unsigned long x=0 ; x<width ; x++) {
const double scalar_x = double(x) / width;
const double mb_x = scalar_x * right + (1-scalar_x) * left;
row[3*x + 0] = 255;
row[3*x + 1] = 255;
row[3*x + 2] = 255;
double c_x = mb_x;
double c_y = mb_y;
for (unsigned i=1 ; i<iterations ; ++i) {
const double len2 = c_x*c_x + c_y*c_y;
if (len2 > 4) {
// escaped
// smooth with fractional escape velocity
float escape_vel = i + 1 - ::log2f(::logf(::sqrtf(len2)));
float tonemapped = escape_vel / (20 + escape_vel);
row[3*x + 0] = png_byte(powf(tonemapped, 10) * 255);
row[3*x + 1] = png_byte(powf(tonemapped, 2.5) * 255);
row[3*x + 2] = png_byte(tonemapped * 255);
/*
row[3*x + 0] = png_byte(escape_vel);
row[3*x + 1] = png_byte(escape_vel);
row[3*x + 2] = png_byte(escape_vel);
*/
break;
}
const double o_x = c_x;
c_x = c_x*c_x - c_y*c_y + mb_x;
c_y = 2 * o_x * c_y + mb_y;
}
}
png_write_row(png_write_struct, &row[0]);
}
png_write_end(png_write_struct, NULL);
} catch (const Exception &e) {
std::cerr << e.msg << std::endl;
code = EXIT_FAILURE;
}
if (png_write_struct != NULL) png_destroy_write_struct(&png_write_struct, (png_infopp)NULL);
if (info_ptr != NULL) png_free_data(png_write_struct, info_ptr, PNG_FREE_ALL, -1);
return code;
}
================================================
FILE: case_studies/fractal/tilegen/mandelbrot_service.py
================================================
#!/usr/bin/python
# Copyright 2015 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Serve fractal images over HTTP by calling out to mandelbrot.
"""
import json
import math
import os
import subprocess
import sys
import time
import flask
app = flask.Flask(__name__)
CONF = None
for i in xrange(1, 60):
try:
with open('conf.json') as conf_file:
CONF = json.load(conf_file)
except IOError:
time.sleep(1)
if CONF == None:
sys.stderr.write('ERROR: Could not open conf.json.')
sys.exit(1)
@app.route("/")
def handle_fractal():
"""Get fractal coordinates from query string, call mandelbrot to generate image.
Returns:
The image, wrapped in an HTML response.
"""
level = int(flask.request.args.get("l", "0"))
x = float(int(flask.request.args.get("x", "0")))
y = float(int(flask.request.args.get("y", "0")))
if level < 0:
level = 0
grid_size = math.pow(2, level)
x0 = "%.30g" % ((x - 0) / grid_size)
y0 = "%.30g" % ((y - 0) / grid_size)
x1 = "%.30g" % ((x + 1) / grid_size)
y1 = "%.30g" % ((y + 1) / grid_size)
print "Tile: %s %s %s %s" % (x0, y0, x1, y1)
width = str(CONF['width'])
height = str(CONF['height'])
iters = str(CONF['iters'])
cmd = ['./mandelbrot', width, height, iters, x0, y0, x1, y1]
image_data = subprocess.check_output(cmd)
response = flask.make_response(image_data)
response.headers["Content-Type"] = "image/png"
response.headers["cache-control"] = "public, max-age=600"
return response
@app.route("/thumb")
def handle_thumb():
"""Get fractal coordinates from query string, call mandelbrot to generate image.
Returns:
The image, wrapped in an HTML response.
"""
level = int(flask.request.args.get("l", "0"))
x = float(flask.request.args.get("x", "0"))
y = float(flask.request.args.get("y", "0"))
if level < 0:
level = 0
grid_size = math.pow(2, -level)
x0 = "%.30g" % (x - 1.5*grid_size)
y0 = "%.30g" % (y - 1.5*grid_size)
x1 = "%.30g" % (x + 1.5*grid_size)
y1 = "%.30g" % (y + 1.5*grid_size)
print "Thumbnail: %s %s %s %s" % (x0, y0, x1, y1)
width = str(CONF['thumb_width'])
height = str(CONF['thumb_height'])
iters = str(CONF['iters'])
cmd = ['./mandelbrot', width, height, iters, x0, y0, x1, y1]
image_data = subprocess.check_output(cmd)
response = flask.make_response(image_data)
response.headers["Content-Type"] = "image/png"
response.headers["cache-control"] = "public, max-age=600"
return response
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000, debug=True)
================================================
FILE: case_studies/kubernetes/README.md
================================================
# Kubernetes Example
This Kubernetes example is based on https://github.com/vasanthbala/hackathon/tree/master/kbp/redis
Generate the yaml (actually json) files for Kubernetes:
```sh
jsonnet -m ./ example.jsonnet
```
Check they are the same as the original handwritten files:
```sh
python test_same.py
```
Clean up
```sh
rm -v *.out *.new.yaml
```
================================================
FILE: case_studies/kubernetes/bigquery-controller.old.yaml
================================================
apiVersion: v1
kind: ReplicationController
metadata:
name: bigquery-controller
labels:
name: bigquery-controller
spec:
replicas: 2
template:
metadata:
labels:
name: bigquery-controller
spec:
containers:
- name: bigquery
image: gcr.io/cooltool-1009/pipeline_image:latest
env:
- name: PROCESSINGSCRIPT
value: redis-to-bigquery
- name: REDISLIST
value: twitter-stream
# Change this to your project ID.
- name: PROJECT_ID
value: cooltool-1009
# Change the following two settings to your dataset and table.
- name: BQ_DATASET
value: rtda
- name: BQ_TABLE
value: tweets
================================================
FILE: case_studies/kubernetes/example.jsonnet
================================================
# Copyright 2015 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
local Kube = import "kube.libsonnet";
{
# The port that this service should serve on.
redis_port:: 6379,
# Change this to your project ID.
project_id:: "cooltool-1009",
# Change the following two settings to your BigQuery dataset and table.
bq_dataset:: "rtda",
bq_table:: "tweets",
# Change the following four settings to your twitter credentials
# information.
twitter_consumer_key:: "xxxx",
twitter_consumer_secret:: "xxxx",
twitter_access_token:: "xxxx",
twitter_access_token_sec:: "xxxx",
"twitter-stream.new.yaml": Kube.v1.ReplicationController("twitter-stream") {
spec: {
replicas: 1,
template: {
metadata: {
labels: {
name: "twitter-stream",
},
},
spec: {
containers: [
{
name: "twitter-to-redis",
image: "gcr.io/%s/pipeline_image:latest" % $.project_id,
env: Kube.pair_list({
PROCESSINGSCRIPT: "twitter-to-redis",
REDISLIST: "twitter-stream",
CONSUMERKEY: $.twitter_consumer_key,
CONSUMERSECRET: $.twitter_consumer_secret,
ACCESSTOKEN: $.twitter_access_token,
ACCESSTOKENSEC: $.twitter_access_token_sec,
TWSTREAMMODE: "sample",
}),
},
],
},
},
},
},
"redis-master-service.new.yaml": Kube.v1.Service("redis-master") {
metadata+: {
name: "redismaster", # Likely a typo in the original.
},
spec: {
ports: [
{
port: $.redis_port,
# You don't need to specify the targetPort if it is the same as the port,
# though here we include it anyway, to show the syntax.
targetPort: $.redis_port,
},
],
selector: {
name: "redis-master",
},
},
},
"redis-master.new.yaml": Kube.v1.ReplicationController("redis-master") {
spec: {
replicas: 1,
template: {
metadata: {
labels: {
name: "redis-master",
},
},
spec: {
containers: [
{
name: "master",
image: "redis",
ports: [
{
containerPort: $.redis_port,
},
],
},
{
name: "collectd",
image: "gcr.io/%s/collectd-redis:latest" % $.project_id,
ports: [],
},
],
},
},
},
},
"bigquery-controller.new.yaml": Kube.v1.ReplicationController("bigquery-controller") {
spec: {
replicas: 2,
template: {
metadata: {
labels: {
name: "bigquery-controller",
},
},
spec: {
containers: [
{
name: "bigquery",
image: "gcr.io/%s/pipeline_image:latest" % $.project_id,
env: Kube.pair_list({
PROCESSINGSCRIPT: "redis-to-bigquery",
REDISLIST: "twitter-stream",
PROJECT_ID: $.project_id,
# Change the following two settings to your dataset and table.
BQ_DATASET: $.bq_dataset,
BQ_TABLE: $.bq_table,
}),
},
],
},
},
},
},
}
================================================
FILE: case_studies/kubernetes/kube.libsonnet
================================================
# Copyright 2015 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
/** A collection of templates and utility functions to make it easier to configure Kubernetes
* workloads.
*/
{
v1:: {
local ApiVersion = { apiVersion: "v1" },
local Metadata(name) = {
metadata: {
name: name,
labels: {
name: name,
},
},
},
ReplicationController(name): ApiVersion + Metadata(name) {
kind: "ReplicationController",
},
Service(name): ApiVersion + Metadata(name) {
kind: "Service",
},
},
pair_list_ex(tab, kfield, vfield)::
[{ [kfield]: k, [vfield]: tab[k] } for k in std.objectFields(tab)],
pair_list(tab)::
self.pair_list_ex(tab, "name", "value"),
}
================================================
FILE: case_studies/kubernetes/redis-master-service.old.yaml
================================================
apiVersion: v1
kind: Service
metadata:
name: redismaster
labels:
name: redis-master
spec:
ports:
# The port that this service should serve on.
# You don't need to specify the targetPort if it is the same as the port,
# though here we include it anyway, to show the syntax.
- port: 6379
targetPort: 6379
selector:
name: redis-master
================================================
FILE: case_studies/kubernetes/redis-master.old.yaml
================================================
apiVersion: v1
kind: ReplicationController
metadata:
name: redis-master
labels:
name: redis-master
spec:
replicas: 1
template:
metadata:
labels:
name: redis-master
spec:
containers:
- name: master
image: redis
ports:
- containerPort: 6379
- name: collectd
image: gcr.io/cooltool-1009/collectd-redis:latest
ports: []
================================================
FILE: case_studies/kubernetes/test_same.py
================================================
# Copyright 2015 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import yaml
import json
import sys
import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
os.system("jsonnet -m ./ example.jsonnet")
files = [
'bigquery-controller',
'redis-master',
'redis-master-service',
'twitter-stream',
]
def jsonstr(v):
return json.dumps(v, sort_keys=True, indent=4, separators=(',', ': '))
def canonicalize(doc):
"""De-duplicate environment vars and sort them alphabetically."""
spec = doc.get('spec')
if not spec: return doc
template = spec.get('template')
if not template: return doc
spec2 = template.get('spec')
if not spec2: return doc
containers = spec2.get('containers')
if not containers: return doc
for container in containers:
env = container.get('env')
if not env: continue
tab = { }
for pair in env:
tab[pair['name']] = pair['value']
new_env = []
for key in sorted(tab):
new_env.append({'name': key, 'value': tab[key]})
container['env'] = new_env
return doc
for filename in files:
with open(filename + '.old.yaml', 'r') as f:
yaml_doc = canonicalize(yaml.load(f, Loader=yaml.SafeLoader))
with open(filename + '.new.yaml', 'r') as f:
jsonnet_doc = yaml.load(f, Loader=yaml.SafeLoader)
if jsonstr(yaml_doc) == jsonstr(jsonnet_doc):
print('Identical: %s' % filename)
else:
print('Not identical, run: diff %s.old.yaml.out %s.new.yaml.out' % (filename, filename))
with open(filename + '.old.yaml.out', 'w') as f:
f.write(jsonstr(yaml_doc))
with open(filename + '.new.yaml.out', 'w') as f:
f.write(jsonstr(jsonnet_doc))
os.remove(filename + '.new.yaml')
================================================
FILE: case_studies/kubernetes/twitter-stream.old.yaml
================================================
apiVersion: v1
kind: ReplicationController
metadata:
name: twitter-stream
labels:
name: twitter-stream
spec:
replicas: 1
template:
metadata:
labels:
name: twitter-stream
spec:
containers:
- name: twitter-to-redis
image: gcr.io/cooltool-1009/pipeline_image:latest
env:
- name: PROCESSINGSCRIPT
value: twitter-to-redis
- name: REDISLIST
value: twitter-stream
# Change the following four settings to your twitter credentials
# information.
- name: CONSUMERKEY
value: xxxx
- name: CONSUMERSECRET
value: xxxx
- name: ACCESSTOKEN
value: xxxx
- name: ACCESSTOKENSEC
value: xxxx
- name: TWSTREAMMODE
value: sample
================================================
FILE: case_studies/micro_fractal/.gitignore
================================================
dev_service_account_key.json
fractal_dev.jsonnet
================================================
FILE: case_studies/micro_fractal/appserv/main.py
================================================
# Copyright 2015 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Frontend for Fractal demo.
Application server for a 3 tier web app. Submits fractal image generation
requests. Manages metadata database. Renders pages with Jinja2.
"""
import datetime
import json
import os
import socket
import sys
import time
import uuid
import flask
import httplib2
import jinja2
from cassandra.auth import PlainTextAuthProvider
from cassandra.cluster import Cluster
from cassandra.cluster import NoHostAvailable
CONF = None
for i in xrange(1, 60):
try:
with open('conf.json') as conf_file:
CONF = json.load(conf_file)
except IOError:
time.sleep(1)
if CONF == None:
sys.stderr.write('ERROR: Could not open conf.json.')
sys.exit(1)
class DbError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
session = None
app = flask.Flask(__name__)
app.config['PROPAGATE_EXCEPTIONS'] = True
JINJA_ENVIRONMENT = jinja2.Environment(
loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
extensions=['jinja2.ext.autoescape'],
autoescape=True)
def render_error(code, msg):
return flask.make_response(my_render_template('error.html', code=code, msg=msg), code)
def db_execute(s, t=()):
global session
if session == None:
try:
ap = PlainTextAuthProvider(username=CONF['database_user'],
password=CONF['database_pass'])
cluster = Cluster(CONF['db_endpoints'], auth_provider=ap)
session = cluster.connect()
session.set_keyspace(CONF['database_name'])
return session.execute(s, t)
except NoHostAvailable:
session = None
raise DbError("Unable to contact database backend.")
else:
try:
return session.execute(s, t)
except NoHostAvailable:
session = None
return db_execute(s, t)
def my_render_template(filename, **context):
context.update(CONF)
return flask.render_template(filename, **context)
def db_clear():
db_execute('TRUNCATE discoveries;')
def db_partition(dt):
#return "%04d-%02d-%02d" % (dt.year, dt.month, dt.day)
return "FIXED"
def db_remember(text, x, y, level):
u = uuid.uuid1()
dt = datetime.datetime.fromtimestamp((u.time - 0x01b21dd213814000L)*100/1e9)
db_execute("INSERT INTO discoveries (Date, TimeId, X, Y, L, Text)"
+ " VALUES (%s, %s, %s, %s, %s, %s)",
(db_partition(dt), u, x, y, level, text))
def db_list():
latest = []
# Keep executing calls until we find 10 or we reach 2013
day_counter = datetime.datetime.now()
last_partition = None
while len(latest) < 10 and day_counter >= datetime.datetime(2013, 1, 1):
curr_partition = db_partition(day_counter)
if last_partition != curr_partition:
last_partition = curr_partition
q = "SELECT * FROM discoveries WHERE Date = '%s' ORDER BY TimeId DESC limit 10;"
rows = db_execute(q % curr_partition)
for row in rows:
u = row[1]
dt = datetime.datetime.fromtimestamp((u.time - 0x01b21dd213814000L)*100/1e9)
latest += [
{'text': row[3], 'x': row[4], 'y': row[5], 'l': row[2], 'ts': dt.isoformat()}
]
day_counter -= datetime.timedelta(1)
return latest
@app.route("/")
def default_handler():
return my_render_template('page.html')
@app.route("/clear_db")
def cleardb_handler():
try:
db_clear()
return 'Done'
except DbError as dbe:
return render_error(500, "Internal error: " + dbe.msg)
@app.route("/remember", methods=['POST'])
def remember_handler():
try:
j = flask.request.json
x = j['x']
y = j['y']
level = j['l']
text = j['text'][:50]
if x < -2: x = -2
if x > 2: x = 2
if y < -2: y = -2
if y > 2: y = 2
if level < 0: level = 0
if level > 50: level = 50
db_remember(text, x, y, level)
return 'Done'
except DbError as dbe:
return render_error(500, "Internal error: " + dbe.msg)
@app.route("/remembered_list")
def remembered_list_handler():
try:
latest = db_list()
return flask.jsonify(latest=latest)
except DbError as dbe:
return render_error(500, "Internal error: " + dbe.msg)
@app.errorhandler(404)
def error_404(error):
return render_error(404, 'Nothing at this URL.')
@app.errorhandler(500)
def error_500(error):
return render_error(500, 'Internal error')
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
================================================
FILE: case_studies/micro_fractal/appserv/static/style.css
================================================
html {
height: 100%;
}
body {
font-family: sans-serif;
height: 100%;
margin: 0;
padding: 0;
background-color: #112;
color: #ccc;
font-family: Arial, Helvetica, sans-serif;
}
a {
color: #fff;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
a:visited {
text-decoration: none;
}
div#left {
float: left;
width: 350px;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
p#banner {
padding: 24px 30px 0px 30px;
font-size: 36pt;
font-weight: bold;
margin: 0;
text-align: center;
}
p#instructions {
margin: 0;
padding: 12px 16px 0 16px;
text-align: justify;
}
div#discoveries {
height: 100%;
margin: 0;
padding: 16px;
}
div#discoveries h1 {
margin: 12px 0 0 0;
font-size: 1.5em;
}
ul#remembered_list {
list-style-type:none;
padding: 0;
margin: 0;
}
a.remembered {
text-decoration: none;
}
li.remembered {
overflow: hidden;
margin: 4px;
}
img.remembered {
float: left;
border-width: 1px;
border-style: solid;
border-color: #444;
margin-right: 16px;
}
p.remembered {
margin: 0;
padding: 8px;
font-size: 11pt;
word-wrap:break-word;
width: 210px;
float: left;
}
div.remembered_date {
position: relative;
}
span.remembered_date {
float: right;
color: #444;
font-size: 10pt;
position: absolute;
right: 0;
top: 44px;
}
div#remember_plus {
margin: 8px 4px;
overflow: hidden;
}
div#remember_plus_text {
float: left;
border-style: solid;
border-width: 1px;
border-color: #444;
margin-right: 16px;
}
p#remember_plus {
margin: 8px;
font-size: 32pt;
text-align: center;
}
textarea#remember_plus_input {
padding: 8px;
font-size: 11pt;
resize: none;
background-color: inherit;
color: #fff;
border: none;
font-family: inherit;
width: 210px;
}
div#right {
background-color: #002;
height: 100%;
max-height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
div#fimg_inside {
padding: 0;
margin: 0;
overflow: hidden;
position: relative;
}
img.fimg {
float: left;
padding: 0;
margin: 0;
/*
outline: 1px solid #f00;
outline-offset: -1px;
*/
}
div#err_box {
padding: 16px;
}
================================================
FILE: case_studies/micro_fractal/appserv/templates/base.html
================================================
<!doctype html public "-//w3c//dtd xhtml 1.0 strict//en"
"http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
<html>
<head>
<title>Mandelbrot Viewer</title>
<link rel=stylesheet type=text/css href="/static/style.css" />
</head>
<body>
<div id=left>
<p id=banner>
Mandelbrot Set Viewer
</p>
<p id=instructions>
{% block instructions %}
{% endblock %}
</p>
<div id=discoveries>
{% block discoveries %}
{% endblock %}
</div>
</div>
<div id=right>
{% block page %}
{% endblock %}
</div>
</body>
</html>
================================================
FILE: case_studies/micro_fractal/appserv/templates/error.html
================================================
{% extends "base.html" %}
{% block page %}
<div id=err_box>
<h1>ERROR: {{ code }}</h1>
<p>{{ msg }}</p>
</div>
{% endblock %}
================================================
FILE: case_studies/micro_fractal/appserv/templates/page.html
================================================
{% extends 'base.html' %}
{% block instructions %}
The <a href="https://en.wikipedia.org/wiki/Mandelbrot_set">Mandelbrot set</a> is a beautiful
fractal popularized by <a href="https://en.wikipedia.org/wiki/Benoit_Mandelbrot">Benoit B.
Mandelbrot</a>. Explore it by clicking to zoom in, and shift+clicking to zoom out. Take a look at
other peoples' discoveries below, or add your own!
{% endblock %}
{% block discoveries %}
<h1>Recent Discoveries</h1>
<div id=remember_plus>
<a href="javascript:void(0);" onclick="remember();">
<div id=remember_plus_text style="width: {{ thumb_width }}px; height: {{ thumb_height }}px;">
<p id=remember_plus> + </p>
</div>
</a>
<textarea id=remember_plus_input rows="2" cols="20" maxlength=50 placeholder="Please enter description..."></textarea>
</div>
<ul id=remembered_list>
</ul>
{% endblock %}
{% block page %}
<div id=fimg_inside onmousedown='fractal_click(event)'> </div>
<script>
var level = 0;
var cx = 0;
var cy = 0;
var min_x = -1;
var max_x = 1;
var min_y = -1;
var max_y = 1;
var min_cell_x = -1;
var max_cell_x = 1;
var min_cell_y = -1;
var max_cell_y = 1;
function refresh_fimgs() {
var div = document.getElementById('right');
var width = div.offsetWidth;
var height = div.offsetHeight;
var scaled_width = width / {{ width }};
var scaled_height = height / {{ height }};
var scaled_x = cx * Math.pow(2, level);
var scaled_y = cy * Math.pow(2, level);
min_x = scaled_x - width / {{ width }} / 2;
min_y = scaled_y - height / {{ height }} / 2;
max_x = scaled_x + width / {{ width }} / 2;
max_y = scaled_y + height / {{ height }} / 2;
min_cell_x = Math.floor(min_x);
max_cell_x = Math.ceil(max_x);
min_cell_y = Math.floor(min_y);
max_cell_y = Math.ceil(max_y);
var cells_wide = max_cell_x - min_cell_x;
var cells_high = max_cell_y - min_cell_y;
var grid_width = cells_wide * {{ width }};
var grid_height = cells_high * {{ height }};
var offset_left = (min_cell_x - min_x) * {{ width }};
var offset_top = (max_cell_y - max_y) * {{ height }};;
var str = '';
for (var y=max_cell_y-1 ; y>=min_cell_y ; --y) {
for (var x=min_cell_x ; x<max_cell_x ; ++x) {
var url = '{{ tilegen_endpoint }}/?l=' + level + '&y=' + y + '&x=' + x;
str += '<img width={{ width }} height={{ height }} class=fimg src=' + url + '>';
}
}
var inside = document.getElementById('fimg_inside');
inside.style.width = grid_width + "px";
inside.style.height = grid_height + "px";
inside.style.left = offset_left + "px";
inside.style.top = -offset_top + "px";
inside.innerHTML = str;
}
window.onresize = refresh_fimgs;
refresh_fimgs();
function fractal_click(e) {
e = e || window.event;
if (e.which != 1) return false;
var right = document.getElementById('right');
var click_div = document.getElementById('fimg_inside');
var img_x = 0;
var img_y = 0;
var div = click_div
do {
img_x += div.offsetLeft;
img_y += div.offsetTop;
div = div.offsetParent;
} while (div);
var PosX, PosY;
if (e.pageX || e.pageY) {
PosX = e.pageX;
PosY = e.pageY;
} else if (e.clientX || e.clientY) {
PosX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
PosY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
} else {
PosX = 0;
PosY = 0;
}
PosX -= img_x;
PosY -= img_y;
// Range between 0 and 1
PosX /= click_div.offsetWidth;
PosY /= click_div.offsetHeight;
// Flip it, because in the browser, (0,0) is in the top left
PosY = 1 - PosY;
// Sometimes these are off
if (PosX < 0 || PosY < 0) return false;
if (PosX > 1 || PosY > 1) return false;
PosX = PosX * max_cell_x + (1 - PosX) * min_cell_x;
PosY = PosY * max_cell_y + (1 - PosY) * min_cell_y;
PosX /= Math.pow(2, level);
PosY /= Math.pow(2, level);
cx = PosX;
cy = PosY;
level = e.shiftKey ? level - 1 : level + 1;
if (level <= 0) {
cx = 0;
cy = 0;
level = 0;
}
if (level > 50) {
level = 50;
}
refresh_fimgs();
return true;
}
var server_json = [ ];
function remember() {
var input = document.getElementById('remember_plus_input');
var item = {
"x": cx,
"y": cy,
"l": level,
"ts": new Date().toISOString(),
"text": input.value,
};
if (item.text.length == 0) {
alert('Please write a short description first.');
} else {
server_json.unshift(item);
update_list();
input.value = "";
var http_request = new XMLHttpRequest();
http_request.open("POST", "/remember", true);
http_request.setRequestHeader("Content-type", "application/json");
http_request.send(JSON.stringify(item));
}
}
function leading_zero(n) {
if (n < 10) {
return "0" + n;
} else {
return n;
}
}
function pretty_date(d) {
var m_names = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
"Aug", "Sep", "Oct", "Nov", "Dec");
return leading_zero(d.getHours())
+ ":" + leading_zero(d.getMinutes())
+ ":" + leading_zero(d.getSeconds())
+ ", " + m_names[d.getMonth()] + " " + d.getDate() + " " + d.getFullYear();
}
function update_list() {
var div = document.getElementById('remembered_list');
var str = '';
if (server_json == null) {
str = "<p class=remembered>Database error.</p>";
} else {
for (var i in server_json) {
var item = server_json[i];
var url = '{{ tilegen_endpoint }}/thumb?l=' + item.l + '&y=' + item.y + '&x=' + item.x;
// Hack to escape HTML
var tmp = document.createElement("DIV");
tmp.innerText = item.text;
var text = tmp.innerHTML;
var link = 'cx='+item.x+'; cy='+item.y+'; level='+item.l+'; refresh_fimgs()';
str += '<a onclick="' + link + '" href="javascript:void(0);">'
+ '<li class=remembered>'
+ '<img class=remembered src="'
+ url
+ '" style="width: {{ thumb_width }}px; height: {{ thumb_height }}px"/>'
+ '<p class=remembered>' + text + '</p>'
+ '<div class=remembered_date>'
+ '<span class=remembered_date>' + pretty_date(new Date(item.ts)) + '</span>'
+ '</div>'
+ '</li>'
+ '</a>\n';
}
}
div.innerHTML = str;
}
function request_list() {
var http_request = new XMLHttpRequest();
http_request.onreadystatechange = function() {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
server_json = JSON.parse(http_request.responseText).latest;
} else {
server_json = null;
}
update_list();
}
}
http_request.open('GET', '/remembered_list', true);
http_request.send();
}
//update_list();
request_list();
-->
</script>
{% endblock %}
================================================
FILE: case_studies/micro_fractal/db/db_export.sh
================================================
#!/usr/bin/env bash
if [ $# != 1 ] ; then
echo "Usage: $0 <db-hostname>"
exit 1
fi
DB_HOSTNAME=$1
CASSANDRA_USER="$(jsonnet -e '(import "main.jsonnet").fractal.cassandraUser')"
CASSANDRA_PASS="$(jsonnet -e '(import "main.jsonnet").fractal.cassandraUserPass')"
ssh -oStrictHostKeyChecking=no -- ${DB_HOSTNAME} sudo cqlsh '$HOSTNAME' -u "$CASSANDRA_USER" -p "$CASSANDRA_PASS" <<< 'COPY fractal.discoveries TO STDOUT;' | sed '$ d' | sed '$ d'
================================================
FILE: case_studies/micro_fractal/db/db_import.sh
================================================
#!/usr/bin/env bash
if [ $# != 1 ] ; then
echo "Usage: $0 <db-hostname>"
exit 1
fi
DB_HOSTNAME=$1
CASSANDRA_USER="$(jsonnet -e '(import "main.jsonnet").fractal.cassandraUser')"
CASSANDRA_PASS="$(jsonnet -e '(import "main.jsonnet").fractal.cassandraUserPass')"
(echo 'COPY fractal.discoveries FROM STDIN;'
cat
echo '\.') | \
ssh -oStrictHostKeyChecking=no -- ${DB_HOSTNAME} sudo cqlsh '$HOSTNAME' -u "$CASSANDRA_USER" -p "$CASSANDRA_PASS"
================================================
FILE: case_studies/micro_fractal/db/nodetool.sh
================================================
#!/usr/bin/env bash
if [ $# == 0 ] ; then
echo "Usage: $0 <db-hostname> ..."
exit 1
fi
DB_HOSTNAME=$1
shift
ssh -oStrictHostKeyChecking=no -- ${DB_HOSTNAME} nodetool "$@"
================================================
FILE: case_studies/micro_fractal/fractal.jsonnet
================================================
local cmd = import 'mmlib/v0.1.2/cmd/cmd.libsonnet';
local cassandra = import 'mmlib/v0.1.2/db/cassandra.libsonnet';
local service_google = import 'mmlib/v0.1.2/service/google.libsonnet';
local web_solutions = import 'mmlib/v0.1.2/web/solutions.libsonnet';
local web = import 'mmlib/v0.1.2/web/web.libsonnet';
function(parent, name) service_google.Service(parent, name) {
local app = self,
cassandraUser:: 'fractal',
dnsSuffix:: error 'Must override dnsSuffix',
cassandraUserPass:: error 'Must override cassandraUserPass',
cassandraRootPass:: error 'Must override cassandraRootPass',
cassandraKeyspace:: 'fractal',
cassandraNodes:: [self.prefixName(n) for n in ['db-n1', 'db-n2', 'db-n3', 'db-n4', 'db-n5']],
// Configuration shared by the application server and tile generation nodes.
ApplicationConf:: {
width: 256,
height: 256,
thumb_width: 64,
thumb_height: 64,
},
DebugPackagesMixin:: {
StandardRootImage+: {
local network_debug = ['traceroute', 'lsof', 'iptraf', 'tcpdump', 'host', 'dnsutils'],
aptPackages+: ['vim', 'git', 'psmisc', 'screen', 'strace'] + network_debug,
},
},
zone: service_google.DnsZone(app, 'zone') {
dnsName: app.dnsSuffix,
},
www: service_google.DnsRecordWww(app, 'www') {
zone: app.zone,
target: app.appserv.fullName,
},
network: service_google.Network(app, 'network'),
appserv: service_google.Cluster3(app, 'appserv') + web.HttpService3 + web_solutions.DebianFlaskHttpService {
local service = self,
dnsZone: app.zone,
networkName: app.network.nameRef,
httpsPort: 443,
Instance+: app.DebugPackagesMixin {
machine_type: 'n1-standard-1',
StandardRootImage+: {
pipPackages+: ['httplib2', 'cassandra-driver', 'blist'],
},
local version = self,
conf:: app.ApplicationConf {
database: app.cassandraKeyspace,
db_endpoints: app.cassandraNodes,
database_name: app.cassandraKeyspace,
database_user: app.cassandraUser,
database_pass: app.cassandraUserPass,
tilegen_endpoint: app.tilegen.endpoint,
},
module: 'main', // Entrypoint in the Python code.
uwsgiConf+: { lazy: 'true' }, // cassandra-driver does not survive fork()
// Copy website content and code.
httpContentCmds+: [
"echo '%s tilegen' >> /etc/hosts" % app.tilegen.addressRef,
cmd.CopyFile { from: std.resolvePath(std.thisFile, 'appserv/*'), to: '/var/www' },
cmd.LiteralFile { content: std.toString(version.conf), to: '/var/www/conf.json' },
],
},
},
tilegen: service_google.Cluster3(app, 'tilegen') + web.HttpService3 + web_solutions.DebianFlaskHttpService {
local service = self,
dnsZone: app.zone,
endpoint:: self.httpsEndpoint,
networkName: app.network.nameRef,
httpsPort: 443,
Instance+: app.DebugPackagesMixin {
machine_type: 'n1-standard-1',
StandardRootImage+: {
aptPackages+: ['g++', 'libpng-dev'],
},
local version = self,
srcDir:: 'tilegen3',
conf:: app.ApplicationConf {
iters: 200,
},
module: 'mandelbrot_service',
httpContentCmds+: [
cmd.CopyFile { from: std.resolvePath(std.thisFile, 'tilegen/*'), to: '/var/www' },
'g++ -Wall -Wextra -ansi -pedantic -O3 -ffast-math -g /var/www/mandelbrot.cpp -lpng -o /var/www/mandelbrot',
cmd.LiteralFile { content: std.toString(version.conf), to: '/var/www/conf.json' },
],
},
},
db: cassandra.GcpDebianCassandra(app, 'db') {
local db = self,
dnsZone: app.zone,
networkName: app.network.nameRef,
rootPassword: app.cassandraRootPass,
cassandraConf+: {
rpc_address:: null, // Unset by making it hidden (::).
listen_address:: null, // Unset by making it hidden (::).
authenticator: 'PasswordAuthenticator',
seed_provider: [
{
class_name: 'org.apache.cassandra.locator.SimpleSeedProvider',
parameters: [{ seeds: std.join(', ', app.cassandraNodes) }],
},
],
},
Instance+: app.DebugPackagesMixin {
machine_type: 'n1-standard-4',
},
// Put some initial data in a fresh database.
StarterNode+: {
local cql_insert(uuid, x, y, l, n) =
'INSERT INTO discoveries (Date, TimeId, X, Y, L, Text) '
+ ("VALUES ('FIXED', %s, %s, %s, %s, '%s');" % [uuid, x, y, l, n]),
initCql: [
"CREATE USER %s WITH PASSWORD '%s';" % [app.cassandraUser, app.cassandraUserPass],
'CREATE KEYSPACE %s WITH REPLICATION = %s;' % [app.cassandraKeyspace, self.initReplication],
'USE %s;' % app.cassandraKeyspace,
'CREATE TABLE discoveries('
+ 'Date TEXT, TimeId TIMEUUID, Text TEXT, X FLOAT, Y FLOAT, L INT, '
+ 'PRIMARY KEY(Date, TimeId));',
cql_insert('18063880-5a4d-11e4-ada4-247703d0f194', '0', '0', '0', 'Zoomed Out'),
cql_insert('66b6d100-5a53-11e4-aa05-247703d0f194',
'-1.21142578125',
'0.3212890625',
'4',
'Lightning'),
cql_insert('77ffdd80-5a53-11e4-8ccf-247703d0f194',
'-1.7568359375',
'-0.0009765625',
'5',
'Self-similarity'),
cql_insert('7fbf8200-5a53-11e4-804a-247703d0f194',
'0.342529296875',
'0.419189453125',
'5',
'Windmills'),
cql_insert('9ae7bd00-5a66-11e4-9c66-247703d0f194',
'-1.48309979046093',
'0.00310595797955671',
'39',
'Star'),
cql_insert('75fe4480-5a7c-11e4-a747-247703d0f194',
'-0.244976043701172',
'0.716987609863281',
'10',
'Baroque'),
cql_insert('abf70380-5b24-11e4-8a46-247703d0f194',
'-1.74749755859375',
'0.009002685546875',
'9',
'Hairy windmills'),
],
},
nodes: {
n1: db.StarterNode {
initReplicationFactor: 1,
},
},
},
prober: service_google.SingleInstance(app, 'prober') {
zone: 'us-central1-b',
dnsZone: app.zone,
networkName: app.network.nameRef,
perServiceFirewalls:: false,
Instance+: app.DebugPackagesMixin {
local version = self,
script:: |||
from selenium import webdriver
import sched
import time
# Option 1 - with ChromeOptions
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
s = sched.scheduler(time.time, time.sleep)
def do_probe(sc):
driver = webdriver.Chrome(
chrome_options=chrome_options,
service_args=['--verbose', '--log-path=/var/log/chromedriver.log'])
driver.get('%(endpoint)s')
time.sleep(5)
print(driver.title)
print(len(driver.find_element_by_id('remembered_list').find_elements_by_tag_name('img')))
s.enter(60, 1, do_probe, (sc,))
s.enter(0, 1, do_probe, (s,))
s.run()
||| % { endpoint: app.appserv.httpsEndpoint },
StandardRootImage+: {
aptPackages+: ['chromium', 'unzip'],
pipPackages+: ['selenium'],
cmds+: [
'wget https://chromedriver.storage.googleapis.com/2.35/chromedriver_linux64.zip',
'unzip chromedriver_linux64.zip',
'mv chromedriver /usr/local/bin',
],
},
cmds+: [
cmd.EnsureDir { dir: '/var/prober', owner: 'root' },
cmd.LiteralFile { content: std.toString(version.script), to: '/var/prober/script.py' },
],
bootCmds+: [
'python /var/prober/script.py',
],
},
},
}
================================================
FILE: case_studies/micro_fractal/fractal_dev.jsonnet.TEMPLATE
================================================
local service_google = import "mmlib/v0.1.2/service/google.libsonnet";
local fractal = import "fractal.jsonnet";
{
environments: {
default: service_google.Credentials {
project: "verbing-noun-123", // CHANGE ME!
serviceAccount: import "dev_service_account_key.json", // PROVIDE THIS FILE!
sshUser: "someuser", // CHANGE ME!
}
},
fractal: fractal {
cassandraUserPass: "xxxxxxxx", // CHANGE ME!
cassandraRootPass: "XXXXXXXX", // CHANGE ME!
dnsSuffix: "dev.yourdomain.com.", // CHANGE ME!
// By default only 1 node is deployed of each subservice.
// However you can configure this.
appserv+: {
zones: ["XXX", "YYY", "ZZZ"], // CHANGE ME!
},
tilegen+: {
zones: ["XXX", "YYY", "ZZZ"], // CHANGE ME!
},
db+: {
nodes+: {
n1+: {
zone: "XXX", // CHANGE ME!
},
},
},
},
}
================================================
FILE: case_studies/micro_fractal/tilegen/mandelbrot.cpp
================================================
/*
Copyright 2015 Google Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>
#include <png.h>
int main(int argc, const char **argv)
{
if (argc != 8) {
std::cerr <<"Usage: <width> <height> <iters> <left> <bottom> <right> <top>" << std::endl;
std::cerr <<"PNG file is written to stdout." << std::endl;
exit(EXIT_FAILURE);
}
unsigned long width = strtoul(argv[1], NULL, 10);
unsigned long height = strtoul(argv[2], NULL, 10);
unsigned long iterations = strtoul(argv[3], NULL, 10);
double left = strtod(argv[4], NULL);
double bottom = strtod(argv[5], NULL);
double right = strtod(argv[6], NULL);
double top = strtod(argv[7], NULL);
struct Exception {
const std::string &msg;
Exception(const std::string &msg) : msg(msg) { }
};
int code = EXIT_SUCCESS;
png_structp png_write_struct = NULL;
volatile png_infop info_ptr = NULL;
try {
png_write_struct = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_write_struct == NULL)
throw Exception("Could not allocate libpng write_struct.");
info_ptr = png_create_info_struct(png_write_struct);
if (info_ptr == NULL)
throw Exception("Could not allocate libpng info_struct.");
if (setjmp(png_jmpbuf(png_write_struct)))
throw Exception("Exception from libpng");
png_init_io(png_write_struct, stdout);
png_set_IHDR(png_write_struct, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB,
PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
png_write_info(png_write_struct, info_ptr);
std::vector<png_byte> row(3 * width);
for (unsigned long y=0 ; y<height ; y++) {
const double scalar_y = double(y) / height;
const double mb_y = scalar_y * bottom + (1-scalar_y) * top; // libpng y==0 is top
for (unsigned long x=0 ; x<width ; x++) {
const double scalar_x = double(x) / width;
const double mb_x = scalar_x * right + (1-scalar_x) * left;
row[3*x + 0] = 255;
row[3*x + 1] = 255;
row[3*x + 2] = 255;
double c_x = mb_x;
double c_y = mb_y;
for (unsigned i=1 ; i<iterations ; ++i) {
const double len2 = c_x*c_x + c_y*c_y;
if (len2 > 4) {
// escaped
// smooth with fractional escape velocity
float escape_vel = i + 1 - ::log2f(::logf(::sqrtf(len2)));
float tonemapped = escape_vel / (20 + escape_vel);
row[3*x + 0] = png_byte(powf(tonemapped, 10) * 255);
row[3*x + 1] = png_byte(powf(tonemapped, 2.5) * 255);
row[3*x + 2] = png_byte(tonemapped * 255);
/*
row[3*x + 0] = png_byte(escape_vel);
row[3*x + 1] = png_byte(escape_vel);
row[3*x + 2] = png_byte(escape_vel);
*/
break;
}
const double o_x = c_x;
c_x = c_x*c_x - c_y*c_y + mb_x;
c_y = 2 * o_x * c_y + mb_y;
}
}
png_write_row(png_write_struct, &row[0]);
}
png_write_end(png_write_struct, NULL);
} catch (const Exception &e) {
std::cerr << e.msg << std::endl;
code = EXIT_FAILURE;
}
if (png_write_struct != NULL) png_destroy_write_struct(&png_write_struct, (png_infopp)NULL);
if (info_ptr != NULL) png_free_data(png_write_struct, info_ptr, PNG_FREE_ALL, -1);
return code;
}
================================================
FILE: case_studies/micro_fractal/tilegen/mandelbrot_service.py
================================================
#!/usr/bin/python
# Copyright 2015 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Serve fractal images over HTTP by calling out to mandelbrot.
"""
import hashlib
import json
import math
import os
import string
import subprocess
import time
import flask
app = flask.Flask(__name__)
if __name__ == "__main__":
CONF = {
'width': 128,
'height': 128,
'iters': 100,
}
else:
CONF = None
for i in xrange(1, 60):
print 'Attempting to read conf.json: Attempt %d' % i
try:
with open('conf.json') as conf_file:
CONF = json.load(conf_file)
print 'Success!'
break
except IOError:
time.sleep(1)
if CONF == None:
sys.stderr.write('ERROR: Could not open conf.json.')
sys.exit(1)
with open ('mandelbrot.cpp', "r") as stream:
content = stream.read()
ETAG = hashlib.sha1(content).hexdigest()
def check_etag():
request_etag = flask.request.headers.get('If-None-Match', None)
print 'Request ETag: %s' % request_etag
return ETAG == request_etag
@app.route("/")
def handle_fractal():
"""Get fractal coordinates from query string, call mandelbrot to generate image.
Returns:
The image, wrapped in an HTML response.
"""
if check_etag():
return flask.make_response(), 304
level = int(flask.request.args.get("l", "0"))
x = float(int(flask.request.args.get("x", "0")))
y = float(int(flask.request.args.get("y", "0")))
if level < 0:
level = 0
grid_size = math.pow(2, level)
x0 = "%.30g" % ((x - 0) / grid_size)
y0 = "%.30g" % ((y - 0) / grid_size)
x1 = "%.30g" % ((x + 1) / grid_size)
y1 = "%.30g" % ((y + 1) / grid_size)
print "Tile: %s %s %s %s" % (x0, y0, x1, y1)
width = str(CONF['width'])
height = str(CONF['height'])
iters = str(CONF['iters'])
cmd = ['./mandelbrot', width, height, iters, x0, y0, x1, y1]
image_data = subprocess.check_output(cmd)
response = flask.make_response(image_data)
response.headers["Content-Type"] = "image/png"
response.headers["cache-control"] = "public, max-age=600"
response.headers["ETag"] = ETAG
return response
@app.route("/thumb")
def handle_thumb():
"""Get fractal coordinates from query string, call mandelbrot to generate image.
Returns:
The image, wrapped in an HTML response.
"""
if check_etag():
return flask.make_response(), 304
level = int(flask.request.args.get("l", "0"))
x = float(flask.request.args.get("x", "0"))
y = float(flask.request.args.get("y", "0"))
if level < 0:
level = 0
grid_size = math.pow(2, -level)
x0 = "%.30g" % (x - 1.5*grid_size)
y0 = "%.30g" % (y - 1.5*grid_size)
x1 = "%.30g" % (x + 1.5*grid_size)
y1 = "%.30g" % (y + 1.5*grid_size)
print "Thumbnail: %s %s %s %s" % (x0, y0, x1, y1)
width = str(CONF['thumb_width'])
height = str(CONF['thumb_height'])
iters = str(CONF['iters'])
cmd = ['./mandelbrot', width, height, iters, x0, y0, x1, y1]
image_data = subprocess.check_output(cmd)
response = flask.make_response(image_data)
response.headers["Content-Type"] = "image/png"
response.headers["cache-control"] = "public, max-age=600"
response.headers["ETag"] = ETAG
return response
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000, debug=False)
================================================
FILE: case_studies/micromanage/.gitignore
================================================
tests/testenv.libsonnet
examples/test_google.jsonnet
examples/test_amazon.jsonnet
================================================
FILE: case_studies/micromanage/build_artefact.py
================================================
# Copyright 2015 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
class BuildArtefact(object):
def name(self):
raise NotImplementedError("%s has no override" % self.__class__.__name__)
def needsBuild(self):
raise NotImplementedError("%s has no override" % self.__class__.__name__)
def getOutputFiles(self, dirpath):
raise NotImplementedError("%s has no override" % self.__class__.__name__)
def outputFiles(self, dirpath):
raise NotImplementedError("%s has no override" % self.__class__.__name__)
def doBuild(self, dirpath):
raise NotImplementedError("%s has no override" % self.__class__.__name__)
def wait(self):
raise NotImplementedError("%s has no override" % self.__class__.__name__)
def postBuild(self):
raise NotImplementedError("%s has no override" % self.__class__.__name__)
================================================
FILE: case_studies/micromanage/cmds.py
================================================
# Copyright 2015 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import glob
import os
# E.g. replace Simon's cat with 'Simon'\''s cat'.
def escape(s):
return "'%s'" % s.replace("'", "'\"'\"'")
def file_glob(given_glob, to, prefix):
dirs = []
files = []
lp = len(prefix)
for f in glob.glob(given_glob):
if os.path.isdir(f):
more_files = file_glob('%s/*' % f, to, prefix)
files += more_files
else:
files.append((f, to + f[lp:]))
return files
def compile_command_to_bash(cmd):
if isinstance(cmd, basestring):
if len(cmd) > 1 and cmd[0] == '#':
comment = cmd[1:].strip()
return ['echo %s' % escape(comment)]
return [cmd]
elif cmd['kind'] == 'LiteralFile':
return [
'echo -n %s > %s' % (escape(cmd['content']), escape(cmd['to'])),
'chmod -v %s %s' % (cmd['filePermissions'], escape(cmd['to'])),
'chown -v %s.%s %s' % (cmd['owner'], cmd['group'], escape(cmd['to'])),
]
elif cmd['kind'] == 'CopyFile':
files = file_glob(cmd['from'], cmd['to'], os.path.dirname(cmd['from']))
dirs = set([os.path.dirname(f[1]) for f in files]) - {cmd['to']}
lines = []
for d in sorted(dirs):
lines += [
'mkdir -v -p %s' % escape(d),
'chmod -v %s %s' % (cmd['dirPermissions'], escape(d)),
'chown -v %s.%s %s' % (cmd['owner'], cmd['group'], escape(d)),
]
for f in sorted(files):
with open (f[0], "r") as stream:
content = stream.read()
lines += [
'echo -n %s > %s' % (escape(content), escape(f[1])),
'chmod -v %s %s' % (cmd['filePermissions'], escape(f[1])),
'chown -v %s.%s %s' % (cmd['owner'], cmd['group'], escape(f[1])),
]
return lines
elif cmd['kind'] == 'EnsureDir':
return [
'mkdir -v -p %s' % escape(cmd['dir']),
'chmod -v %s %s' % (cmd['dirPermissions'], escape(cmd['dir'])),
'chown -v %s.%s %s' % (cmd['owner'], cmd['group'], escape(cmd['dir'])),
]
else:
raise RuntimeError('Did not recognize image command kind: ' + cmd['kind'])
================================================
FILE: case_studies/micromanage/examples/hello_world_amazon.jsonnet
================================================
# Copyright 2015 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
local service_amazon = import "mmlib/v0.1.2/service/amazon.libsonnet";
local service_google = import "mmlib/v0.1.2/service/google.libsonnet";
local web = import "mmlib/v0.1.2/web/web.libsonnet";
local web_solutions = import "mmlib/v0.1.2/web/solutions.libsonnet";
local debian_amis = import "mmlib/v0.1.2/amis/debian.libsonnet";
local cmd = import "mmlib/v0.1.2/cmd/cmd.libsonnet";
{
environments: {
default: {
kind: "Amazon",
accessKey: "XXXXXXXX", // Change this.
secretKey: "xxxxxxxx", // Change this.
region: "us-west-1",
},
},
mynetwork: service_amazon.Network {
subnets: {
"us-west-1c": "10.0.0.0/24",
},
},
// Simple case -- one machine serving this Python script.
/*
helloworld: service_amazon.SingleInstance(null, 'helloworld') + web.HttpSingleInstance
+ web_solutions.DebianFlaskHttpService {
zone: "us-west-1c",
keyName: "kp",
uwsgiModuleContent: |||
import flask
import socket
app = flask.Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello from %s!' % socket.gethostname()
|||,
networkName: "mynetwork",
},
*/
// For production -- allows canarying changes, also use a dns zone
helloworld2: service_amazon.Cluster3(null, 'helloworld2') + web.HttpService3
+ web_solutions.DebianFlaskHttpService {
local service = self,
httpPort: 8080,
zones: ["us-west-1c", "us-west-1b"],
versions: {
v1: service.Instance {
uwsgiModuleContent: |||
import flask
import socket
app = flask.Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello from %s!' % socket.gethostname()
|||,
},
v2: service.Instance {
uwsgiModuleContent: |||
import flask
import socket
app = flask.Flask(__name__)
@app.route('/')
def hello_world():
return 'Greetings from %s!' % socket.gethostname()
|||,
},
},
deployment: {
v1: {
deployed: [1, 2, 3],
attached: [1, 2, 3],
},
v2: {
deployed: [1],
attached: [1],
},
},
// dnsZone: $.dns,
// dnsZoneName: "dns",
},
/*
dns: service_amazon.DnsZone(null, 'dns') {
local service = self,
dnsName: "hw.example.com.",
},
// If you own a domain, enable this and the zone service below, then create an NS record to
// the allocated nameserver.
www: service_google.DnsRecordWww(null, 'dns') {
zone: $.dns,
zoneName: "dns",
target: "helloworld2",
},
*/
}
================================================
FILE: case_studies/micromanage/examples/hello_world_google.jsonnet
================================================
# Copyright 2015 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
local service_amazon = import "mmlib/v0.1.2/service/amazon.libsonnet";
local service_google = import "mmlib/v0.1.2/service/google.libsonnet";
local web = import "mmlib/v0.1.2/web/web.libsonnet";
local web_solutions = import "mmlib/v0.1.2/web/solutions.libsonnet";
{
environments: {
default: {
kind: "Google",
project: "readable-name-123", // Change this.
region: "us-central1", // Maybe change this.
// Download this file from the developers console.
serviceAccount: import "service_account.json",
sshUser: "yourusername", // Change this.
},
},
// The following examples support HTTPs, thus require DNS names and
// SSL certificates. Removing the httpsPort will disable that.
// Simple case -- one machine serving this Python script.
helloworld: service_google.SingleInstance(null, 'helloworld') + web.HttpSingleInstance
+ web_solutions.DebianFlaskHttpService {
httpsPort: 443,
sslCertificate: importstr 'cert.pem', // You will need to provision this.
sslCertificateKey: importstr 'key.pem', // You will need to provision this.
zone: "us-central1-f",
uwsgiModuleContent: |||
import flask
import socket
app = flask.Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello from %s!' % socket.gethostname()
|||,
dnsZone: $.dns,
},
// For production -- allows canarying changes, also use a dns zone
helloworld2: service_google.Cluster3(null, 'helloworld2') + web.HttpService3
+ web_solutions.DebianFlaskHttpService {
local service = self,
httpPort: null,
httpsPort: 443,
sslCertificate: importstr 'cert.pem', // You will need to provision this.
sslCertificateKey: importstr 'key.pem', // You will need to provision this.
zones: ["us-central1-b", "us-central1-c", "us-central1-f"],
versions: {
v1: service.Instance {
uwsgiModuleContent: |||
import flask
import socket
app = flask.Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello from %s!' % socket.gethostname()
|||,
},
v2: service.Instance {
uwsgiModuleContent: |||
import flask
import socket
app = flask.Flask(__name__)
@app.route('/')
def hello_world():
return 'Greetings from %s!' % socket.gethostname()
|||,
},
},
deployment: {
v1: {
deployed: [1, 2, 3],
attached: [1, 2, 3],
},
v2: {
deployed: [1],
attached: [1],
},
},
dnsZone: $.dns,
},
dns: service_google.DnsZone(null, 'dns') {
local service = self,
dnsName: "hw.example.com.",
},
// If you own a domain, enable this and the zone service below, then create an NS record to
// the allocated nameserver.
www: service_google.DnsRecordWww(null, 'www') {
zone: $.dns,
target: "helloworld2",
},
}
================================================
FILE: case_studies/micromanage/lib/mmlib/v0.1.2/amis/debian.libsonnet
================================================
// Connect to machines using the username "admin" and -i yourkey.pem
// Source: https://wiki.debian.org/Cloud/AmazonEC2Image/Wheezy
// HVM, EBS
{
wheezy: {
amd64: {
'20150128': {
'ap-northeast-1': 'ami-b25d44b3',
'ap-southeast-1': 'ami-aeb49ffc',
'ap-southeast-2': 'ami-6b770351',
'eu-central-1': 'ami-98043785',
'eu-west-1': 'ami-61e56916',
'sa-east-1': 'ami-3d8b3720',
'us-east-1': 'ami-e0efab88',
'us-west-1': 'ami-b4869ff1',
'us-west-2': 'ami-431a4273',
'us-gov-west-1': 'ami-d13455f2',
'cn-north-1': 'ami-48029071',
},
},
},
}
================================================
FILE: case_studies/micromanage/lib/mmlib/v0.1.2/amis/ubuntu.libsonnet
================================================
// Connect to machines using the username "ubuntu" and -i yourkey.pem
// Source: https://cloud-images.ubuntu.com/locator/ec2/
// There is a URL to get a JSON dump but I've lost it.
local regions(amis) = std.set([a[0] for a in amis]);
local region_amis(amis, v) = [a for a in amis if a[0] == v];
local oses(amis) = std.set([a[1] for a in amis]);
local os_amis(amis, v) = [a for a in amis if a[1] == v];
local archs(amis) = std.set([a[3] for a in amis]);
local arch_amis(amis, v) = [a for a in amis if a[3] == v];
local dates(amis) = std.set([a[5] for a in amis]);
local date_amis(amis, v) = [a for a in amis if a[5] == v];
local strip_from_url(url) =
local suffix = std.split(url, '>')[1];
std.substr(suffix, 0, std.length(suffix) - 3);
local all_amis = (import 'ubuntu_raw.json').aaData;
{
[os]: local this_os_amis = os_amis(all_amis, os); {
[arch]: local this_arch_amis = arch_amis(this_os_amis, arch); {
[date]: local this_date_amis = date_amis(this_arch_amis, date); {
[r]: strip_from_url(region_amis(this_date_amis, r)[0][6])
for r in regions(this_date_amis)
}
for date in dates(this_arch_amis)
}
for arch in archs(this_os_amis)
}
fo
Showing preview only (249K chars total). Download the full file or copy to clipboard to get everything.
gitextract_p_3vr9vi/ ├── .bazelignore ├── .bazelversion ├── .clang-format ├── .gitattributes ├── .github/ │ └── workflows/ │ ├── build_and_test.yml │ ├── create_archive.sh │ ├── doc_update.yml │ ├── publish-python.yml │ └── release.yml ├── .gitignore ├── CMakeLists.txt ├── CONTRIBUTING ├── Dockerfile ├── LICENSE ├── MANIFEST.in ├── MODULE.bazel ├── PYTHON_README.md ├── README.md ├── benchmarks/ │ ├── .gitignore │ ├── bench.01.jsonnet │ ├── bench.02.jsonnet │ ├── bench.03.jsonnet │ ├── bench.04.jsonnet │ ├── bench.06.jsonnet │ ├── bench.07.jsonnet │ ├── bench.08.jsonnet │ ├── bench.09.jsonnet │ ├── gen_big_object.jsonnet │ └── regen_benchmarks.sh ├── case_studies/ │ ├── fractal/ │ │ ├── .gitignore │ │ ├── appserv/ │ │ │ ├── main.py │ │ │ ├── static/ │ │ │ │ └── style.css │ │ │ └── templates/ │ │ │ ├── base.html │ │ │ ├── error.html │ │ │ └── page.html │ │ ├── credentials.libsonnet.TEMPLATE │ │ ├── lib/ │ │ │ ├── cassandra.libsonnet │ │ │ ├── packer.libsonnet │ │ │ └── terraform.libsonnet │ │ ├── service.jsonnet │ │ └── tilegen/ │ │ ├── mandelbrot.cpp │ │ └── mandelbrot_service.py │ ├── kubernetes/ │ │ ├── README.md │ │ ├── bigquery-controller.old.yaml │ │ ├── example.jsonnet │ │ ├── kube.libsonnet │ │ ├── redis-master-service.old.yaml │ │ ├── redis-master.old.yaml │ │ ├── test_same.py │ │ └── twitter-stream.old.yaml │ ├── micro_fractal/ │ │ ├── .gitignore │ │ ├── appserv/ │ │ │ ├── main.py │ │ │ ├── static/ │ │ │ │ └── style.css │ │ │ └── templates/ │ │ │ ├── base.html │ │ │ ├── error.html │ │ │ └── page.html │ │ ├── db/ │ │ │ ├── db_export.sh │ │ │ ├── db_import.sh │ │ │ └── nodetool.sh │ │ ├── fractal.jsonnet │ │ ├── fractal_dev.jsonnet.TEMPLATE │ │ └── tilegen/ │ │ ├── mandelbrot.cpp │ │ └── mandelbrot_service.py │ └── micromanage/ │ ├── .gitignore │ ├── build_artefact.py │ ├── cmds.py │ ├── examples/ │ │ ├── hello_world_amazon.jsonnet │ │ └── hello_world_google.jsonnet │ ├── lib/ │ │ └── mmlib/ │ │ └── v0.1.2/ │ │ ├── amis/ │ │ │ ├── debian.libsonnet │ │ │ ├── ubuntu.libsonnet │ │ │ ├── ubuntu.prof │ │ │ └── ubuntu_raw.json │ │ ├── cmd/ │ │ │ ├── apt.libsonnet │ │ │ ├── cmd.libsonnet │ │ │ └── pip.libsonnet │ │ ├── db/ │ │ │ └── cassandra.libsonnet │ │ ├── service/ │ │ │ ├── amazon.libsonnet │ │ │ ├── base.libsonnet │ │ │ └── google.libsonnet │ │ └── web/ │ │ ├── nginx.libsonnet │ │ ├── solutions.libsonnet │ │ ├── uwsgi_flask.libsonnet │ │ └── web.libsonnet │ ├── micromanage │ ├── micromanage.py │ ├── packer.py │ ├── service.py │ ├── service_amazon.py │ ├── service_google.py │ ├── tests/ │ │ ├── amazon/ │ │ │ └── test_single_instance.jsonnet │ │ ├── google/ │ │ │ ├── test_empty.jsonnet │ │ │ ├── test_nested.jsonnet │ │ │ └── test_single_instance.jsonnet │ │ ├── test_really_empty.jsonnet │ │ └── testenv.libsonnet.TEMPLATE │ ├── util.py │ └── validate.py ├── cmd/ │ ├── BUILD │ ├── jsonnet.cpp │ ├── jsonnetfmt.cpp │ ├── utils.cpp │ └── utils.h ├── cpp/ │ ├── BUILD │ ├── libjsonnet++.cpp │ ├── libjsonnet++_test.cpp │ ├── libjsonnet_locale_test.cpp │ └── testdata/ │ ├── BUILD │ ├── example.jsonnet │ ├── example_golden.json │ ├── importing.jsonnet │ ├── importing_golden.json │ ├── invalid.jsonnet │ └── invalid.out ├── doc/ │ ├── .gitignore │ ├── CNAME │ ├── _config.yml │ ├── _includes/ │ │ ├── demo.inc │ │ └── examples/ │ │ ├── arith.jsonnet │ │ ├── arith.jsonnet.golden │ │ ├── cocktail-comprehensions.jsonnet │ │ ├── cocktail-comprehensions.jsonnet.golden │ │ ├── comprehensions.jsonnet │ │ ├── comprehensions.jsonnet.golden │ │ ├── computed-fields.jsonnet │ │ ├── computed-fields.jsonnet.golden │ │ ├── conditionals.jsonnet │ │ ├── conditionals.jsonnet.golden │ │ ├── error-examples.jsonnet │ │ ├── error-examples.jsonnet.golden │ │ ├── functions.jsonnet │ │ ├── functions.jsonnet.golden │ │ ├── garnish.txt │ │ ├── imports.jsonnet │ │ ├── imports.jsonnet.golden │ │ ├── inner-reference.jsonnet │ │ ├── inner-reference.jsonnet.golden │ │ ├── library-ext.libsonnet │ │ ├── library-tla.libsonnet │ │ ├── martinis.libsonnet │ │ ├── mixins.jsonnet │ │ ├── mixins.jsonnet.golden │ │ ├── negroni.jsonnet │ │ ├── negroni.jsonnet.golden │ │ ├── oo-contrived.jsonnet │ │ ├── oo-contrived.jsonnet.golden │ │ ├── references.jsonnet │ │ ├── references.jsonnet.golden │ │ ├── sours-oo.jsonnet │ │ ├── sours-oo.jsonnet.golden │ │ ├── sours.jsonnet │ │ ├── sours.jsonnet.golden │ │ ├── syntax.jsonnet │ │ ├── syntax.jsonnet.golden │ │ ├── templates.libsonnet │ │ ├── top-level-ext.jsonnet │ │ ├── top-level-ext.jsonnet.golden │ │ ├── top-level-tla.jsonnet │ │ ├── top-level-tla.jsonnet.golden │ │ ├── utils.libsonnet │ │ ├── variables.jsonnet │ │ └── variables.jsonnet.golden │ ├── _layouts/ │ │ ├── base.html │ │ ├── default.html │ │ ├── markdown.html │ │ ├── redirect.html │ │ ├── stdlib.html │ │ └── wide.html │ ├── _stdlib_gen/ │ │ ├── html.libsonnet │ │ ├── jekyll.libsonnet │ │ ├── run_tests.sh │ │ ├── stdlib-content-test.jsonnet │ │ ├── stdlib-content.jsonnet │ │ └── stdlib.jsonnet │ ├── articles/ │ │ ├── comparisons.html │ │ ├── design.html │ │ ├── fractal.1.html │ │ ├── fractal.2.html │ │ ├── fractal.3.html │ │ ├── kubernetes.html │ │ └── output-formats.html │ ├── case_studies/ │ │ └── casestudy_fractal.1.html │ ├── contributing.html │ ├── css/ │ │ ├── cellphone-small.css │ │ ├── cellphone.css │ │ ├── desktop.css │ │ └── doc.css │ ├── docs/ │ │ ├── index.html │ │ ├── stdlib.html │ │ └── tutorial.html │ ├── index.html │ ├── js/ │ │ ├── codemirror-mode-jsonnet.js │ │ ├── demo.js │ │ ├── menu.js │ │ └── wasm_exec.js │ ├── language/ │ │ └── spec.html │ ├── learning/ │ │ ├── community.html │ │ ├── getting_started.html │ │ ├── tools.html │ │ └── tutorial.html │ ├── ref/ │ │ ├── bindings.html │ │ ├── language.html.md │ │ ├── spec.html │ │ └── stdlib.html │ └── third_party/ │ ├── CodeMirror/ │ │ ├── LICENSE │ │ ├── README.md │ │ ├── addon/ │ │ │ └── edit/ │ │ │ └── matchbrackets.js │ │ ├── lib/ │ │ │ ├── codemirror.css │ │ │ └── codemirror.js │ │ └── mode/ │ │ └── yaml/ │ │ └── yaml.js │ ├── MathJax-2.7.2/ │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── .travis.yml │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE │ │ ├── MathJax.js │ │ ├── README.md │ │ ├── bower.json │ │ ├── composer.json │ │ ├── config/ │ │ │ ├── AM_CHTML-full.js │ │ │ ├── AM_CHTML.js │ │ │ ├── AM_HTMLorMML-full.js │ │ │ ├── AM_HTMLorMML.js │ │ │ ├── AM_SVG-full.js │ │ │ ├── AM_SVG.js │ │ │ ├── Accessible-full.js │ │ │ ├── Accessible.js │ │ │ ├── MML_CHTML-full.js │ │ │ ├── MML_CHTML.js │ │ │ ├── MML_HTMLorMML-full.js │ │ │ ├── MML_HTMLorMML.js │ │ │ ├── MML_SVG-full.js │ │ │ ├── MML_SVG.js │ │ │ ├── MMLorHTML.js │ │ │ ├── Safe.js │ │ │ ├── TeX-AMS-MML_HTMLorMML-full.js │ │ │ ├── TeX-AMS-MML_HTMLorMML.js │ │ │ ├── TeX-AMS-MML_SVG-full.js │ │ │ ├── TeX-AMS-MML_SVG.js │ │ │ ├── TeX-AMS_CHTML-full.js │ │ │ ├── TeX-AMS_CHTML.js │ │ │ ├── TeX-AMS_HTML-full.js │ │ │ ├── TeX-AMS_HTML.js │ │ │ ├── TeX-AMS_SVG-full.js │ │ │ ├── TeX-AMS_SVG.js │ │ │ ├── TeX-MML-AM_CHTML-full.js │ │ │ ├── TeX-MML-AM_CHTML.js │ │ │ ├── TeX-MML-AM_HTMLorMML-full.js │ │ │ ├── TeX-MML-AM_HTMLorMML.js │ │ │ ├── TeX-MML-AM_SVG-full.js │ │ │ ├── TeX-MML-AM_SVG.js │ │ │ ├── default.js │ │ │ └── local/ │ │ │ └── local.js │ │ ├── docs/ │ │ │ ├── README.txt │ │ │ ├── html/ │ │ │ │ └── index.html │ │ │ └── source/ │ │ │ └── README.txt │ │ ├── extensions/ │ │ │ ├── AssistiveMML.js │ │ │ ├── CHTML-preview.js │ │ │ ├── FontWarnings.js │ │ │ ├── HTML-CSS/ │ │ │ │ └── handle-floats.js │ │ │ ├── HelpDialog.js │ │ │ ├── MatchWebFonts.js │ │ │ ├── MathEvents.js │ │ │ ├── MathML/ │ │ │ │ ├── content-mathml.js │ │ │ │ └── mml3.js │ │ │ ├── MathMenu.js │ │ │ ├── MathZoom.js │ │ │ ├── Safe.js │ │ │ ├── TeX/ │ │ │ │ ├── AMScd.js │ │ │ │ ├── AMSmath.js │ │ │ │ ├── AMSsymbols.js │ │ │ │ ├── HTML.js │ │ │ │ ├── action.js │ │ │ │ ├── autobold.js │ │ │ │ ├── autoload-all.js │ │ │ │ ├── bbox.js │ │ │ │ ├── begingroup.js │ │ │ │ ├── boldsymbol.js │ │ │ │ ├── cancel.js │ │ │ │ ├── color.js │ │ │ │ ├── enclose.js │ │ │ │ ├── extpfeil.js │ │ │ │ ├── mathchoice.js │ │ │ │ ├── mediawiki-texvc.js │ │ │ │ ├── mhchem.js │ │ │ │ ├── mhchem3/ │ │ │ │ │ └── mhchem.js │ │ │ │ ├── newcommand.js │ │ │ │ ├── noErrors.js │ │ │ │ ├── noUndefined.js │ │ │ │ ├── unicode.js │ │ │ │ └── verb.js │ │ │ ├── a11y/ │ │ │ │ ├── accessibility-menu.js │ │ │ │ ├── auto-collapse.js │ │ │ │ ├── collapsible.js │ │ │ │ ├── explorer.js │ │ │ │ ├── invalid_keypress.ogg │ │ │ │ ├── mathjax-sre.js │ │ │ │ ├── mathmaps/ │ │ │ │ │ ├── .htaccess │ │ │ │ │ ├── functions/ │ │ │ │ │ │ ├── algebra.js │ │ │ │ │ │ ├── elementary.js │ │ │ │ │ │ ├── hyperbolic.js │ │ │ │ │ │ └── trigonometry.js │ │ │ │ │ ├── mathmaps_ie.js │ │ │ │ │ ├── symbols/ │ │ │ │ │ │ ├── greek-capital.js │ │ │ │ │ │ ├── greek-mathfonts.js │ │ │ │ │ │ ├── greek-scripts.js │ │ │ │ │ │ ├── greek-small.js │ │ │ │ │ │ ├── greek-symbols.js │ │ │ │ │ │ ├── hebrew_letters.js │ │ │ │ │ │ ├── latin-lower-double-accent.js │ │ │ │ │ │ ├── latin-lower-normal.js │ │ │ │ │ │ ├── latin-lower-phonetic.js │ │ │ │ │ │ ├── latin-lower-single-accent.js │ │ │ │ │ │ ├── latin-mathfonts.js │ │ │ │ │ │ ├── latin-rest.js │ │ │ │ │ │ ├── latin-upper-double-accent.js │ │ │ │ │ │ ├── latin-upper-normal.js │ │ │ │ │ │ ├── latin-upper-single-accent.js │ │ │ │ │ │ ├── math_angles.js │ │ │ │ │ │ ├── math_arrows.js │ │ │ │ │ │ ├── math_characters.js │ │ │ │ │ │ ├── math_delimiters.js │ │ │ │ │ │ ├── math_digits.js │ │ │ │ │ │ ├── math_geometry.js │ │ │ │ │ │ ├── math_harpoons.js │ │ │ │ │ │ ├── math_non_characters.js │ │ │ │ │ │ ├── math_symbols.js │ │ │ │ │ │ ├── math_whitespace.js │ │ │ │ │ │ └── other_stars.js │ │ │ │ │ └── units/ │ │ │ │ │ ├── energy.js │ │ │ │ │ ├── length.js │ │ │ │ │ ├── memory.js │ │ │ │ │ ├── other.js │ │ │ │ │ ├── speed.js │ │ │ │ │ ├── temperature.js │ │ │ │ │ ├── time.js │ │ │ │ │ ├── volume.js │ │ │ │ │ └── weight.js │ │ │ │ ├── semantic-enrich.js │ │ │ │ └── wgxpath.install.js │ │ │ ├── asciimath2jax.js │ │ │ ├── fast-preview.js │ │ │ ├── jsMath2jax.js │ │ │ ├── mml2jax.js │ │ │ ├── tex2jax.js │ │ │ └── toMathML.js │ │ ├── fonts/ │ │ │ └── HTML-CSS/ │ │ │ ├── Asana-Math/ │ │ │ │ ├── OFL.txt │ │ │ │ └── otf/ │ │ │ │ ├── AsanaMathJax_Alphabets-Regular.otf │ │ │ │ ├── AsanaMathJax_Arrows-Regular.otf │ │ │ │ ├── AsanaMathJax_DoubleStruck-Regular.otf │ │ │ │ ├── AsanaMathJax_Fraktur-Regular.otf │ │ │ │ ├── AsanaMathJax_Latin-Regular.otf │ │ │ │ ├── AsanaMathJax_Main-Regular.otf │ │ │ │ ├── AsanaMathJax_Marks-Regular.otf │ │ │ │ ├── AsanaMathJax_Misc-Regular.otf │ │ │ │ ├── AsanaMathJax_Monospace-Regular.otf │ │ │ │ ├── AsanaMathJax_NonUnicode-Regular.otf │ │ │ │ ├── AsanaMathJax_Normal-Regular.otf │ │ │ │ ├── AsanaMathJax_Operators-Regular.otf │ │ │ │ ├── AsanaMathJax_SansSerif-Regular.otf │ │ │ │ ├── AsanaMathJax_Script-Regular.otf │ │ │ │ ├── AsanaMathJax_Shapes-Regular.otf │ │ │ │ ├── AsanaMathJax_Size1-Regular.otf │ │ │ │ ├── AsanaMathJax_Size2-Regular.otf │ │ │ │ ├── AsanaMathJax_Size3-Regular.otf │ │ │ │ ├── AsanaMathJax_Size4-Regular.otf │ │ │ │ ├── AsanaMathJax_Size5-Regular.otf │ │ │ │ ├── AsanaMathJax_Size6-Regular.otf │ │ │ │ ├── AsanaMathJax_Symbols-Regular.otf │ │ │ │ └── AsanaMathJax_Variants-Regular.otf │ │ │ ├── Gyre-Pagella/ │ │ │ │ ├── GUST-FONT-LICENSE.txt │ │ │ │ ├── MANIFEST-GyrePagellaMathJax.txt │ │ │ │ └── otf/ │ │ │ │ ├── GyrePagellaMathJax_Alphabets-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Arrows-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_DoubleStruck-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Fraktur-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Latin-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Main-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Marks-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Misc-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Monospace-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_NonUnicode-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Normal-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Operators-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_SansSerif-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Script-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Shapes-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Size1-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Size2-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Size3-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Size4-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Size5-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Size6-Regular.otf │ │ │ │ ├── GyrePagellaMathJax_Symbols-Regular.otf │ │ │ │ └── GyrePagellaMathJax_Variants-Regular.otf │ │ │ ├── Gyre-Termes/ │ │ │ │ ├── GUST-FONT-LICENSE.txt │ │ │ │ ├── MANIFEST-GyreTermesMathJax.txt │ │ │ │ └── otf/ │ │ │ │ ├── GyreTermesMathJax_Alphabets-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Arrows-Regular.otf │ │ │ │ ├── GyreTermesMathJax_DoubleStruck-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Fraktur-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Latin-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Main-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Marks-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Misc-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Monospace-Regular.otf │ │ │ │ ├── GyreTermesMathJax_NonUnicode-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Normal-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Operators-Regular.otf │ │ │ │ ├── GyreTermesMathJax_SansSerif-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Script-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Shapes-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Size1-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Size2-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Size3-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Size4-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Size5-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Size6-Regular.otf │ │ │ │ ├── GyreTermesMathJax_Symbols-Regular.otf │ │ │ │ └── GyreTermesMathJax_Variants-Regular.otf │ │ │ ├── Latin-Modern/ │ │ │ │ ├── GUST-FONT-LICENSE.txt │ │ │ │ ├── MANIFEST-LatinModernMathJax.txt │ │ │ │ └── otf/ │ │ │ │ ├── LatinModernMathJax_Alphabets-Regular.otf │ │ │ │ ├── LatinModernMathJax_Arrows-Regular.otf │ │ │ │ ├── LatinModernMathJax_DoubleStruck-Regular.otf │ │ │ │ ├── LatinModernMathJax_Fraktur-Regular.otf │ │ │ │ ├── LatinModernMathJax_Latin-Regular.otf │ │ │ │ ├── LatinModernMathJax_Main-Regular.otf │ │ │ │ ├── LatinModernMathJax_Marks-Regular.otf │ │ │ │ ├── LatinModernMathJax_Misc-Regular.otf │ │ │ │ ├── LatinModernMathJax_Monospace-Regular.otf │ │ │ │ ├── LatinModernMathJax_NonUnicode-Regular.otf │ │ │ │ ├── LatinModernMathJax_Normal-Regular.otf │ │ │ │ ├── LatinModernMathJax_Operators-Regular.otf │ │ │ │ ├── LatinModernMathJax_SansSerif-Regular.otf │ │ │ │ ├── LatinModernMathJax_Script-Regular.otf │ │ │ │ ├── LatinModernMathJax_Shapes-Regular.otf │ │ │ │ ├── LatinModernMathJax_Size1-Regular.otf │ │ │ │ ├── LatinModernMathJax_Size2-Regular.otf │ │ │ │ ├── LatinModernMathJax_Size3-Regular.otf │ │ │ │ ├── LatinModernMathJax_Size4-Regular.otf │ │ │ │ ├── LatinModernMathJax_Size5-Regular.otf │ │ │ │ ├── LatinModernMathJax_Size6-Regular.otf │ │ │ │ ├── LatinModernMathJax_Size7-Regular.otf │ │ │ │ ├── LatinModernMathJax_Symbols-Regular.otf │ │ │ │ └── LatinModernMathJax_Variants-Regular.otf │ │ │ ├── Neo-Euler/ │ │ │ │ ├── OFL.txt │ │ │ │ └── otf/ │ │ │ │ ├── NeoEulerMathJax_Alphabets-Regular.otf │ │ │ │ ├── NeoEulerMathJax_Arrows-Regular.otf │ │ │ │ ├── NeoEulerMathJax_Fraktur-Regular.otf │ │ │ │ ├── NeoEulerMathJax_Main-Regular.otf │ │ │ │ ├── NeoEulerMathJax_Marks-Regular.otf │ │ │ │ ├── NeoEulerMathJax_NonUnicode-Regular.otf │ │ │ │ ├── NeoEulerMathJax_Normal-Regular.otf │ │ │ │ ├── NeoEulerMathJax_Operators-Regular.otf │ │ │ │ ├── NeoEulerMathJax_Script-Regular.otf │ │ │ │ ├── NeoEulerMathJax_Shapes-Regular.otf │ │ │ │ ├── NeoEulerMathJax_Size1-Regular.otf │ │ │ │ ├── NeoEulerMathJax_Size2-Regular.otf │ │ │ │ ├── NeoEulerMathJax_Size3-Regular.otf │ │ │ │ ├── NeoEulerMathJax_Size4-Regular.otf │ │ │ │ ├── NeoEulerMathJax_Size5-Regular.otf │ │ │ │ ├── NeoEulerMathJax_Symbols-Regular.otf │ │ │ │ └── NeoEulerMathJax_Variants-Regular.otf │ │ │ ├── STIX-Web/ │ │ │ │ ├── OFL.txt │ │ │ │ └── otf/ │ │ │ │ ├── STIXMathJax_Alphabets-Bold.otf │ │ │ │ ├── STIXMathJax_Alphabets-BoldItalic.otf │ │ │ │ ├── STIXMathJax_Alphabets-Italic.otf │ │ │ │ ├── STIXMathJax_Alphabets-Regular.otf │ │ │ │ ├── STIXMathJax_Arrows-Bold.otf │ │ │ │ ├── STIXMathJax_Arrows-Regular.otf │ │ │ │ ├── STIXMathJax_DoubleStruck-Bold.otf │ │ │ │ ├── STIXMathJax_DoubleStruck-BoldItalic.otf │ │ │ │ ├── STIXMathJax_DoubleStruck-Italic.otf │ │ │ │ ├── STIXMathJax_DoubleStruck-Regular.otf │ │ │ │ ├── STIXMathJax_Fraktur-Bold.otf │ │ │ │ ├── STIXMathJax_Fraktur-Regular.otf │ │ │ │ ├── STIXMathJax_Latin-Bold.otf │ │ │ │ ├── STIXMathJax_Latin-BoldItalic.otf │ │ │ │ ├── STIXMathJax_Latin-Italic.otf │ │ │ │ ├── STIXMathJax_Latin-Regular.otf │ │ │ │ ├── STIXMathJax_Main-Bold.otf │ │ │ │ ├── STIXMathJax_Main-BoldItalic.otf │ │ │ │ ├── STIXMathJax_Main-Italic.otf │ │ │ │ ├── STIXMathJax_Main-Regular.otf │ │ │ │ ├── STIXMathJax_Marks-Bold.otf │ │ │ │ ├── STIXMathJax_Marks-BoldItalic.otf │ │ │ │ ├── STIXMathJax_Marks-Italic.otf │ │ │ │ ├── STIXMathJax_Marks-Regular.otf │ │ │ │ ├── STIXMathJax_Misc-Bold.otf │ │ │ │ ├── STIXMathJax_Misc-BoldItalic.otf │ │ │ │ ├── STIXMathJax_Misc-Italic.otf │ │ │ │ ├── STIXMathJax_Misc-Regular.otf │ │ │ │ ├── STIXMathJax_Monospace-Regular.otf │ │ │ │ ├── STIXMathJax_Normal-Bold.otf │ │ │ │ ├── STIXMathJax_Normal-BoldItalic.otf │ │ │ │ ├── STIXMathJax_Normal-Italic.otf │ │ │ │ ├── STIXMathJax_Operators-Bold.otf │ │ │ │ ├── STIXMathJax_Operators-Regular.otf │ │ │ │ ├── STIXMathJax_SansSerif-Bold.otf │ │ │ │ ├── STIXMathJax_SansSerif-BoldItalic.otf │ │ │ │ ├── STIXMathJax_SansSerif-Italic.otf │ │ │ │ ├── STIXMathJax_SansSerif-Regular.otf │ │ │ │ ├── STIXMathJax_Script-BoldItalic.otf │ │ │ │ ├── STIXMathJax_Script-Italic.otf │ │ │ │ ├── STIXMathJax_Script-Regular.otf │ │ │ │ ├── STIXMathJax_Shapes-Bold.otf │ │ │ │ ├── STIXMathJax_Shapes-BoldItalic.otf │ │ │ │ ├── STIXMathJax_Shapes-Regular.otf │ │ │ │ ├── STIXMathJax_Size1-Regular.otf │ │ │ │ ├── STIXMathJax_Size2-Regular.otf │ │ │ │ ├── STIXMathJax_Size3-Regular.otf │ │ │ │ ├── STIXMathJax_Size4-Regular.otf │ │ │ │ ├── STIXMathJax_Size5-Regular.otf │ │ │ │ ├── STIXMathJax_Symbols-Bold.otf │ │ │ │ ├── STIXMathJax_Symbols-Regular.otf │ │ │ │ ├── STIXMathJax_Variants-Bold.otf │ │ │ │ ├── STIXMathJax_Variants-BoldItalic.otf │ │ │ │ ├── STIXMathJax_Variants-Italic.otf │ │ │ │ └── STIXMathJax_Variants-Regular.otf │ │ │ └── TeX/ │ │ │ └── otf/ │ │ │ ├── MathJax_AMS-Regular.otf │ │ │ ├── MathJax_Caligraphic-Bold.otf │ │ │ ├── MathJax_Caligraphic-Regular.otf │ │ │ ├── MathJax_Fraktur-Bold.otf │ │ │ ├── MathJax_Fraktur-Regular.otf │ │ │ ├── MathJax_Main-Bold.otf │ │ │ ├── MathJax_Main-Italic.otf │ │ │ ├── MathJax_Main-Regular.otf │ │ │ ├── MathJax_Math-BoldItalic.otf │ │ │ ├── MathJax_Math-Italic.otf │ │ │ ├── MathJax_Math-Regular.otf │ │ │ ├── MathJax_SansSerif-Bold.otf │ │ │ ├── MathJax_SansSerif-Italic.otf │ │ │ ├── MathJax_SansSerif-Regular.otf │ │ │ ├── MathJax_Script-Regular.otf │ │ │ ├── MathJax_Size1-Regular.otf │ │ │ ├── MathJax_Size2-Regular.otf │ │ │ ├── MathJax_Size3-Regular.otf │ │ │ ├── MathJax_Size4-Regular.otf │ │ │ ├── MathJax_Typewriter-Regular.otf │ │ │ ├── MathJax_Vector-Bold.otf │ │ │ ├── MathJax_Vector-Regular.otf │ │ │ ├── MathJax_WinChrome-Regular.otf │ │ │ └── MathJax_WinIE6-Regular.otf │ │ ├── jax/ │ │ │ ├── element/ │ │ │ │ └── mml/ │ │ │ │ ├── jax.js │ │ │ │ └── optable/ │ │ │ │ ├── Arrows.js │ │ │ │ ├── BasicLatin.js │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ ├── CombDiactForSymbols.js │ │ │ │ ├── Dingbats.js │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ ├── GeometricShapes.js │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ ├── Latin1Supplement.js │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ ├── MathOperators.js │ │ │ │ ├── MiscMathSymbolsA.js │ │ │ │ ├── MiscMathSymbolsB.js │ │ │ │ ├── MiscSymbolsAndArrows.js │ │ │ │ ├── MiscTechnical.js │ │ │ │ ├── SpacingModLetters.js │ │ │ │ ├── SuppMathOperators.js │ │ │ │ ├── SupplementalArrowsA.js │ │ │ │ └── SupplementalArrowsB.js │ │ │ ├── input/ │ │ │ │ ├── AsciiMath/ │ │ │ │ │ ├── config.js │ │ │ │ │ └── jax.js │ │ │ │ ├── MathML/ │ │ │ │ │ ├── config.js │ │ │ │ │ ├── entities/ │ │ │ │ │ │ ├── a.js │ │ │ │ │ │ ├── b.js │ │ │ │ │ │ ├── c.js │ │ │ │ │ │ ├── d.js │ │ │ │ │ │ ├── e.js │ │ │ │ │ │ ├── f.js │ │ │ │ │ │ ├── fr.js │ │ │ │ │ │ ├── g.js │ │ │ │ │ │ ├── h.js │ │ │ │ │ │ ├── i.js │ │ │ │ │ │ ├── j.js │ │ │ │ │ │ ├── k.js │ │ │ │ │ │ ├── l.js │ │ │ │ │ │ ├── m.js │ │ │ │ │ │ ├── n.js │ │ │ │ │ │ ├── o.js │ │ │ │ │ │ ├── opf.js │ │ │ │ │ │ ├── p.js │ │ │ │ │ │ ├── q.js │ │ │ │ │ │ ├── r.js │ │ │ │ │ │ ├── s.js │ │ │ │ │ │ ├── scr.js │ │ │ │ │ │ ├── t.js │ │ │ │ │ │ ├── u.js │ │ │ │ │ │ ├── v.js │ │ │ │ │ │ ├── w.js │ │ │ │ │ │ ├── x.js │ │ │ │ │ │ ├── y.js │ │ │ │ │ │ └── z.js │ │ │ │ │ └── jax.js │ │ │ │ └── TeX/ │ │ │ │ ├── config.js │ │ │ │ └── jax.js │ │ │ └── output/ │ │ │ ├── CommonHTML/ │ │ │ │ ├── autoload/ │ │ │ │ │ ├── annotation-xml.js │ │ │ │ │ ├── maction.js │ │ │ │ │ ├── menclose.js │ │ │ │ │ ├── mglyph.js │ │ │ │ │ ├── mmultiscripts.js │ │ │ │ │ ├── ms.js │ │ │ │ │ ├── mtable.js │ │ │ │ │ └── multiline.js │ │ │ │ ├── config.js │ │ │ │ ├── fonts/ │ │ │ │ │ └── TeX/ │ │ │ │ │ ├── AMS-Regular.js │ │ │ │ │ ├── Caligraphic-Bold.js │ │ │ │ │ ├── Fraktur-Bold.js │ │ │ │ │ ├── Fraktur-Regular.js │ │ │ │ │ ├── Main-Bold.js │ │ │ │ │ ├── Math-BoldItalic.js │ │ │ │ │ ├── SansSerif-Bold.js │ │ │ │ │ ├── SansSerif-Italic.js │ │ │ │ │ ├── SansSerif-Regular.js │ │ │ │ │ ├── Script-Regular.js │ │ │ │ │ ├── Typewriter-Regular.js │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ └── fontdata.js │ │ │ │ └── jax.js │ │ │ ├── HTML-CSS/ │ │ │ │ ├── autoload/ │ │ │ │ │ ├── annotation-xml.js │ │ │ │ │ ├── maction.js │ │ │ │ │ ├── menclose.js │ │ │ │ │ ├── mglyph.js │ │ │ │ │ ├── mmultiscripts.js │ │ │ │ │ ├── ms.js │ │ │ │ │ ├── mtable.js │ │ │ │ │ └── multiline.js │ │ │ │ ├── config.js │ │ │ │ ├── fonts/ │ │ │ │ │ ├── Asana-Math/ │ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Main/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Script/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ │ └── fontdata.js │ │ │ │ │ ├── Gyre-Pagella/ │ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Main/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Script/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ │ └── fontdata.js │ │ │ │ │ ├── Gyre-Termes/ │ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Main/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Script/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ │ └── fontdata.js │ │ │ │ │ ├── Latin-Modern/ │ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Main/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Script/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size7/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ │ └── fontdata.js │ │ │ │ │ ├── Neo-Euler/ │ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Main/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Script/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ │ └── fontdata.js │ │ │ │ │ ├── STIX/ │ │ │ │ │ │ ├── General/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ ├── AlphaPresentForms.js │ │ │ │ │ │ │ │ ├── Arrows.js │ │ │ │ │ │ │ │ ├── BBBold.js │ │ │ │ │ │ │ │ ├── BoldFraktur.js │ │ │ │ │ │ │ │ ├── BoxDrawing.js │ │ │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ │ │ ├── CombDiactForSymbols.js │ │ │ │ │ │ │ │ ├── ControlPictures.js │ │ │ │ │ │ │ │ ├── CurrencySymbols.js │ │ │ │ │ │ │ │ ├── Cyrillic.js │ │ │ │ │ │ │ │ ├── EnclosedAlphanum.js │ │ │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ │ │ ├── GeometricShapes.js │ │ │ │ │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ │ │ │ │ ├── GreekBold.js │ │ │ │ │ │ │ │ ├── GreekSSBold.js │ │ │ │ │ │ │ │ ├── IPAExtensions.js │ │ │ │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ │ │ │ ├── LatinExtendedAdditional.js │ │ │ │ │ │ │ │ ├── LatinExtendedB.js │ │ │ │ │ │ │ │ ├── LatinExtendedD.js │ │ │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ │ ├── MathBold.js │ │ │ │ │ │ │ │ ├── MathOperators.js │ │ │ │ │ │ │ │ ├── MathSSBold.js │ │ │ │ │ │ │ │ ├── MiscMathSymbolsA.js │ │ │ │ │ │ │ │ ├── MiscMathSymbolsB.js │ │ │ │ │ │ │ │ ├── MiscSymbols.js │ │ │ │ │ │ │ │ ├── MiscTechnical.js │ │ │ │ │ │ │ │ ├── NumberForms.js │ │ │ │ │ │ │ │ ├── PhoneticExtensions.js │ │ │ │ │ │ │ │ ├── SpacingModLetters.js │ │ │ │ │ │ │ │ ├── SuperAndSubscripts.js │ │ │ │ │ │ │ │ └── SuppMathOperators.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ ├── AlphaPresentForms.js │ │ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ │ │ ├── BoxDrawing.js │ │ │ │ │ │ │ │ ├── CombDiactForSymbols.js │ │ │ │ │ │ │ │ ├── ControlPictures.js │ │ │ │ │ │ │ │ ├── CurrencySymbols.js │ │ │ │ │ │ │ │ ├── Cyrillic.js │ │ │ │ │ │ │ │ ├── EnclosedAlphanum.js │ │ │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ │ │ │ │ ├── GreekBoldItalic.js │ │ │ │ │ │ │ │ ├── GreekSSBoldItalic.js │ │ │ │ │ │ │ │ ├── IPAExtensions.js │ │ │ │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ │ │ │ ├── LatinExtendedAdditional.js │ │ │ │ │ │ │ │ ├── LatinExtendedB.js │ │ │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ │ ├── MathBoldItalic.js │ │ │ │ │ │ │ │ ├── MathBoldScript.js │ │ │ │ │ │ │ │ ├── MathOperators.js │ │ │ │ │ │ │ │ ├── MathSSItalicBold.js │ │ │ │ │ │ │ │ └── SpacingModLetters.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ ├── AlphaPresentForms.js │ │ │ │ │ │ │ │ ├── BoxDrawing.js │ │ │ │ │ │ │ │ ├── CombDiactForSymbols.js │ │ │ │ │ │ │ │ ├── ControlPictures.js │ │ │ │ │ │ │ │ ├── CurrencySymbols.js │ │ │ │ │ │ │ │ ├── Cyrillic.js │ │ │ │ │ │ │ │ ├── EnclosedAlphanum.js │ │ │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ │ │ │ │ ├── GreekItalic.js │ │ │ │ │ │ │ │ ├── IPAExtensions.js │ │ │ │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ │ │ │ ├── LatinExtendedAdditional.js │ │ │ │ │ │ │ │ ├── LatinExtendedB.js │ │ │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ │ ├── MathItalic.js │ │ │ │ │ │ │ │ ├── MathOperators.js │ │ │ │ │ │ │ │ ├── MathSSItalic.js │ │ │ │ │ │ │ │ ├── MathScript.js │ │ │ │ │ │ │ │ ├── SpacingModLetters.js │ │ │ │ │ │ │ │ └── ij.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── AlphaPresentForms.js │ │ │ │ │ │ │ ├── Arrows.js │ │ │ │ │ │ │ ├── BBBold.js │ │ │ │ │ │ │ ├── BlockElements.js │ │ │ │ │ │ │ ├── BoldFraktur.js │ │ │ │ │ │ │ ├── BoxDrawing.js │ │ │ │ │ │ │ ├── CJK.js │ │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ │ ├── CombDiactForSymbols.js │ │ │ │ │ │ │ ├── ControlPictures.js │ │ │ │ │ │ │ ├── CurrencySymbols.js │ │ │ │ │ │ │ ├── Cyrillic.js │ │ │ │ │ │ │ ├── Dingbats.js │ │ │ │ │ │ │ ├── EnclosedAlphanum.js │ │ │ │ │ │ │ ├── Fraktur.js │ │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ │ ├── GeometricShapes.js │ │ │ │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ │ │ │ ├── GreekBold.js │ │ │ │ │ │ │ ├── GreekBoldItalic.js │ │ │ │ │ │ │ ├── GreekItalic.js │ │ │ │ │ │ │ ├── GreekSSBold.js │ │ │ │ │ │ │ ├── GreekSSBoldItalic.js │ │ │ │ │ │ │ ├── Hiragana.js │ │ │ │ │ │ │ ├── IPAExtensions.js │ │ │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ │ │ ├── LatinExtendedAdditional.js │ │ │ │ │ │ │ ├── LatinExtendedB.js │ │ │ │ │ │ │ ├── LatinExtendedD.js │ │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ ├── MathBold.js │ │ │ │ │ │ │ ├── MathBoldItalic.js │ │ │ │ │ │ │ ├── MathBoldScript.js │ │ │ │ │ │ │ ├── MathItalic.js │ │ │ │ │ │ │ ├── MathOperators.js │ │ │ │ │ │ │ ├── MathSS.js │ │ │ │ │ │ │ ├── MathSSBold.js │ │ │ │ │ │ │ ├── MathSSItalic.js │ │ │ │ │ │ │ ├── MathSSItalicBold.js │ │ │ │ │ │ │ ├── MathScript.js │ │ │ │ │ │ │ ├── MathTT.js │ │ │ │ │ │ │ ├── MiscMathSymbolsA.js │ │ │ │ │ │ │ ├── MiscMathSymbolsB.js │ │ │ │ │ │ │ ├── MiscSymbols.js │ │ │ │ │ │ │ ├── MiscSymbolsAndArrows.js │ │ │ │ │ │ │ ├── MiscTechnical.js │ │ │ │ │ │ │ ├── NumberForms.js │ │ │ │ │ │ │ ├── PhoneticExtensions.js │ │ │ │ │ │ │ ├── SpacingModLetters.js │ │ │ │ │ │ │ ├── Specials.js │ │ │ │ │ │ │ ├── SuperAndSubscripts.js │ │ │ │ │ │ │ ├── SuppMathOperators.js │ │ │ │ │ │ │ ├── SupplementalArrowsA.js │ │ │ │ │ │ │ ├── SupplementalArrowsB.js │ │ │ │ │ │ │ └── ij.js │ │ │ │ │ │ ├── IntegralsD/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── All.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── IntegralsSm/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── All.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── IntegralsUp/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── All.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── IntegralsUpD/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── All.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── IntegralsUpSm/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── All.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ │ └── PrivateUse.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ │ └── PrivateUse.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ │ └── PrivateUse.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ └── PrivateUse.js │ │ │ │ │ │ ├── SizeFiveSym/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SizeFourSym/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SizeOneSym/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SizeThreeSym/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SizeTwoSym/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── fontdata-1.0.js │ │ │ │ │ │ ├── fontdata-beta.js │ │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ │ └── fontdata.js │ │ │ │ │ ├── STIX-Web/ │ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Main/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Script/ │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ │ └── fontdata.js │ │ │ │ │ └── TeX/ │ │ │ │ │ ├── AMS/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ ├── Arrows.js │ │ │ │ │ │ ├── BBBold.js │ │ │ │ │ │ ├── BoxDrawing.js │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ ├── Dingbats.js │ │ │ │ │ │ ├── EnclosedAlphanum.js │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ ├── GeometricShapes.js │ │ │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ ├── MathOperators.js │ │ │ │ │ │ ├── MiscMathSymbolsB.js │ │ │ │ │ │ ├── MiscSymbols.js │ │ │ │ │ │ ├── MiscTechnical.js │ │ │ │ │ │ ├── PUA.js │ │ │ │ │ │ ├── SpacingModLetters.js │ │ │ │ │ │ └── SuppMathOperators.js │ │ │ │ │ ├── Caligraphic/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ ├── Other.js │ │ │ │ │ │ │ └── PUA.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ ├── Other.js │ │ │ │ │ │ └── PUA.js │ │ │ │ │ ├── Greek/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Main/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ ├── Arrows.js │ │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ │ ├── CombDiactForSymbols.js │ │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ │ ├── GeometricShapes.js │ │ │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ │ │ ├── LatinExtendedB.js │ │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ ├── MathOperators.js │ │ │ │ │ │ │ ├── MiscMathSymbolsA.js │ │ │ │ │ │ │ ├── MiscSymbols.js │ │ │ │ │ │ │ ├── MiscTechnical.js │ │ │ │ │ │ │ ├── SpacingModLetters.js │ │ │ │ │ │ │ ├── SuppMathOperators.js │ │ │ │ │ │ │ └── SupplementalArrowsA.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ ├── GeometricShapes.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ ├── MiscSymbols.js │ │ │ │ │ │ └── SpacingModLetters.js │ │ │ │ │ ├── Math/ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Italic/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ └── Other.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ └── Other.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ └── Other.js │ │ │ │ │ ├── Script/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ └── Other.js │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Typewriter/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ └── Other.js │ │ │ │ │ ├── WinChrome/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── WinIE6/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ ├── AMS.js │ │ │ │ │ │ ├── Bold.js │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ └── fontdata.js │ │ │ │ ├── imageFonts.js │ │ │ │ └── jax.js │ │ │ ├── NativeMML/ │ │ │ │ ├── config.js │ │ │ │ └── jax.js │ │ │ ├── PlainSource/ │ │ │ │ ├── config.js │ │ │ │ └── jax.js │ │ │ ├── PreviewHTML/ │ │ │ │ ├── config.js │ │ │ │ └── jax.js │ │ │ └── SVG/ │ │ │ ├── autoload/ │ │ │ │ ├── annotation-xml.js │ │ │ │ ├── maction.js │ │ │ │ ├── menclose.js │ │ │ │ ├── mglyph.js │ │ │ │ ├── mmultiscripts.js │ │ │ │ ├── ms.js │ │ │ │ ├── mtable.js │ │ │ │ └── multiline.js │ │ │ ├── config.js │ │ │ ├── fonts/ │ │ │ │ ├── Asana-Math/ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Main/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Script/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ └── fontdata.js │ │ │ │ ├── Gyre-Pagella/ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Main/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Script/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ └── fontdata.js │ │ │ │ ├── Gyre-Termes/ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Main/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Script/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ └── fontdata.js │ │ │ │ ├── Latin-Modern/ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Main/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Script/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size7/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ └── fontdata.js │ │ │ │ ├── Neo-Euler/ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Main/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Script/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ └── fontdata.js │ │ │ │ ├── STIX-Web/ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Main/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Italic/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Script/ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ └── fontdata.js │ │ │ │ └── TeX/ │ │ │ │ ├── AMS/ │ │ │ │ │ └── Regular/ │ │ │ │ │ ├── Arrows.js │ │ │ │ │ ├── BoxDrawing.js │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ ├── Dingbats.js │ │ │ │ │ ├── EnclosedAlphanum.js │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ ├── GeometricShapes.js │ │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ ├── Main.js │ │ │ │ │ ├── MathOperators.js │ │ │ │ │ ├── MiscMathSymbolsB.js │ │ │ │ │ ├── MiscSymbols.js │ │ │ │ │ ├── MiscTechnical.js │ │ │ │ │ ├── PUA.js │ │ │ │ │ ├── SpacingModLetters.js │ │ │ │ │ └── SuppMathOperators.js │ │ │ │ ├── Caligraphic/ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ └── Regular/ │ │ │ │ │ └── Main.js │ │ │ │ ├── Fraktur/ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ ├── Other.js │ │ │ │ │ │ └── PUA.js │ │ │ │ │ └── Regular/ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ ├── Main.js │ │ │ │ │ ├── Other.js │ │ │ │ │ └── PUA.js │ │ │ │ ├── Main/ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ ├── Arrows.js │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ ├── CombDiactForSymbols.js │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ ├── GeometricShapes.js │ │ │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ │ ├── LatinExtendedB.js │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ ├── MathOperators.js │ │ │ │ │ │ ├── MiscMathSymbolsA.js │ │ │ │ │ │ ├── MiscSymbols.js │ │ │ │ │ │ ├── MiscTechnical.js │ │ │ │ │ │ ├── SpacingModLetters.js │ │ │ │ │ │ ├── SuppMathOperators.js │ │ │ │ │ │ └── SupplementalArrowsA.js │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ │ ├── LatinExtendedB.js │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ └── MathOperators.js │ │ │ │ │ └── Regular/ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ ├── GeometricShapes.js │ │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ ├── LatinExtendedB.js │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ ├── Main.js │ │ │ │ │ ├── MathOperators.js │ │ │ │ │ ├── MiscSymbols.js │ │ │ │ │ ├── SpacingModLetters.js │ │ │ │ │ └── SuppMathOperators.js │ │ │ │ ├── Math/ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ └── Italic/ │ │ │ │ │ └── Main.js │ │ │ │ ├── SansSerif/ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ └── Other.js │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ └── Other.js │ │ │ │ │ └── Regular/ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ ├── Main.js │ │ │ │ │ └── Other.js │ │ │ │ ├── Script/ │ │ │ │ │ └── Regular/ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ └── Main.js │ │ │ │ ├── Size1/ │ │ │ │ │ └── Regular/ │ │ │ │ │ └── Main.js │ │ │ │ ├── Size2/ │ │ │ │ │ └── Regular/ │ │ │ │ │ └── Main.js │ │ │ │ ├── Size3/ │ │ │ │ │ └── Regular/ │ │ │ │ │ └── Main.js │ │ │ │ ├── Size4/ │ │ │ │ │ └── Regular/ │ │ │ │ │ └── Main.js │ │ │ │ ├── Typewriter/ │ │ │ │ │ └── Regular/ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ ├── Main.js │ │ │ │ │ └── Other.js │ │ │ │ ├── fontdata-extra.js │ │ │ │ └── fontdata.js │ │ │ └── jax.js │ │ ├── latest.js │ │ ├── localization/ │ │ │ ├── ar/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── ar.js │ │ │ ├── ast/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── ast.js │ │ │ ├── bcc/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── bcc.js │ │ │ ├── bg/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── bg.js │ │ │ ├── br/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── br.js │ │ │ ├── ca/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── ca.js │ │ │ ├── cdo/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── cdo.js │ │ │ ├── ce/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── ce.js │ │ │ ├── cs/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── cs.js │ │ │ ├── cy/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── cy.js │ │ │ ├── da/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── da.js │ │ │ ├── de/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── de.js │ │ │ ├── diq/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── diq.js │ │ │ ├── en/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── en.js │ │ │ ├── eo/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── eo.js │ │ │ ├── es/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── es.js │ │ │ ├── fa/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── fa.js │ │ │ ├── fi/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── fi.js │ │ │ ├── fr/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── fr.js │ │ │ ├── gl/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── gl.js │ │ │ ├── he/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── he.js │ │ │ ├── ia/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── ia.js │ │ │ ├── it/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── it.js │ │ │ ├── ja/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── ja.js │ │ │ ├── kn/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── kn.js │ │ │ ├── ko/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── ko.js │ │ │ ├── lb/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── lb.js │ │ │ ├── lki/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── lki.js │ │ │ ├── lt/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── lt.js │ │ │ ├── mk/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── mk.js │ │ │ ├── nl/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── nl.js │ │ │ ├── oc/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── oc.js │ │ │ ├── pl/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── pl.js │ │ │ ├── pt/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── pt.js │ │ │ ├── pt-br/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── pt-br.js │ │ │ ├── qqq/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── qqq.js │ │ │ ├── ru/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── ru.js │ │ │ ├── scn/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── scn.js │ │ │ ├── sco/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── sco.js │ │ │ ├── sk/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── sk.js │ │ │ ├── sl/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── sl.js │ │ │ ├── sv/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── sv.js │ │ │ ├── th/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── th.js │ │ │ ├── tr/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── tr.js │ │ │ ├── uk/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── uk.js │ │ │ ├── vi/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── vi.js │ │ │ ├── zh-hans/ │ │ │ │ ├── FontWarnings.js │ │ │ │ ├── HTML-CSS.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── MathML.js │ │ │ │ ├── MathMenu.js │ │ │ │ ├── TeX.js │ │ │ │ └── zh-hans.js │ │ │ └── zh-hant/ │ │ │ ├── FontWarnings.js │ │ │ ├── HTML-CSS.js │ │ │ ├── HelpDialog.js │ │ │ ├── MathML.js │ │ │ ├── MathMenu.js │ │ │ ├── TeX.js │ │ │ └── zh-hant.js │ │ ├── package.json │ │ ├── test/ │ │ │ ├── examples.html │ │ │ ├── index-images.html │ │ │ ├── index.html │ │ │ ├── localization.html │ │ │ ├── sample-all-at-once.html │ │ │ ├── sample-asciimath.html │ │ │ ├── sample-autoload.html │ │ │ ├── sample-dynamic-2.html │ │ │ ├── sample-dynamic-steps.html │ │ │ ├── sample-dynamic.html │ │ │ ├── sample-eqnum.html │ │ │ ├── sample-eqrefs.html │ │ │ ├── sample-loader-config.html │ │ │ ├── sample-loader.html │ │ │ ├── sample-macros.html │ │ │ ├── sample-mediawiki-texvc.html │ │ │ ├── sample-mml.html │ │ │ ├── sample-signals.html │ │ │ ├── sample-tex.html │ │ │ └── sample.html │ │ └── unpacked/ │ │ ├── MathJax.js │ │ ├── config/ │ │ │ ├── AM_CHTML-full.js │ │ │ ├── AM_CHTML.js │ │ │ ├── AM_HTMLorMML-full.js │ │ │ ├── AM_HTMLorMML.js │ │ │ ├── AM_SVG-full.js │ │ │ ├── AM_SVG.js │ │ │ ├── Accessible-full.js │ │ │ ├── Accessible.js │ │ │ ├── MML_CHTML-full.js │ │ │ ├── MML_CHTML.js │ │ │ ├── MML_HTMLorMML-full.js │ │ │ ├── MML_HTMLorMML.js │ │ │ ├── MML_SVG-full.js │ │ │ ├── MML_SVG.js │ │ │ ├── MMLorHTML.js │ │ │ ├── Safe.js │ │ │ ├── TeX-AMS-MML_HTMLorMML-full.js │ │ │ ├── TeX-AMS-MML_HTMLorMML.js │ │ │ ├── TeX-AMS-MML_SVG-full.js │ │ │ ├── TeX-AMS-MML_SVG.js │ │ │ ├── TeX-AMS_CHTML-full.js │ │ │ ├── TeX-AMS_CHTML.js │ │ │ ├── TeX-AMS_HTML-full.js │ │ │ ├── TeX-AMS_HTML.js │ │ │ ├── TeX-AMS_SVG-full.js │ │ │ ├── TeX-AMS_SVG.js │ │ │ ├── TeX-MML-AM_CHTML-full.js │ │ │ ├── TeX-MML-AM_CHTML.js │ │ │ ├── TeX-MML-AM_HTMLorMML-full.js │ │ │ ├── TeX-MML-AM_HTMLorMML.js │ │ │ ├── TeX-MML-AM_SVG-full.js │ │ │ ├── TeX-MML-AM_SVG.js │ │ │ ├── default.js │ │ │ └── local/ │ │ │ └── local.js │ │ ├── extensions/ │ │ │ ├── AssistiveMML.js │ │ │ ├── CHTML-preview.js │ │ │ ├── FontWarnings.js │ │ │ ├── HTML-CSS/ │ │ │ │ └── handle-floats.js │ │ │ ├── HelpDialog.js │ │ │ ├── MatchWebFonts.js │ │ │ ├── MathEvents.js │ │ │ ├── MathML/ │ │ │ │ ├── content-mathml.js │ │ │ │ └── mml3.js │ │ │ ├── MathMenu.js │ │ │ ├── MathZoom.js │ │ │ ├── Safe.js │ │ │ ├── TeX/ │ │ │ │ ├── AMScd.js │ │ │ │ ├── AMSmath.js │ │ │ │ ├── AMSsymbols.js │ │ │ │ ├── HTML.js │ │ │ │ ├── action.js │ │ │ │ ├── autobold.js │ │ │ │ ├── autoload-all.js │ │ │ │ ├── bbox.js │ │ │ │ ├── begingroup.js │ │ │ │ ├── boldsymbol.js │ │ │ │ ├── cancel.js │ │ │ │ ├── color.js │ │ │ │ ├── enclose.js │ │ │ │ ├── extpfeil.js │ │ │ │ ├── mathchoice.js │ │ │ │ ├── mediawiki-texvc.js │ │ │ │ ├── mhchem.js │ │ │ │ ├── mhchem3/ │ │ │ │ │ └── mhchem.js │ │ │ │ ├── newcommand.js │ │ │ │ ├── noErrors.js │ │ │ │ ├── noUndefined.js │ │ │ │ ├── unicode.js │ │ │ │ └── verb.js │ │ │ ├── a11y/ │ │ │ │ ├── accessibility-menu.js │ │ │ │ ├── auto-collapse.js │ │ │ │ ├── collapsible.js │ │ │ │ ├── explorer.js │ │ │ │ ├── invalid_keypress.ogg │ │ │ │ ├── mathjax-sre.js │ │ │ │ ├── mathmaps/ │ │ │ │ │ ├── .htaccess │ │ │ │ │ ├── functions/ │ │ │ │ │ │ ├── algebra.js │ │ │ │ │ │ ├── elementary.js │ │ │ │ │ │ ├── hyperbolic.js │ │ │ │ │ │ └── trigonometry.js │ │ │ │ │ ├── mathmaps_ie.js │ │ │ │ │ ├── symbols/ │ │ │ │ │ │ ├── greek-capital.js │ │ │ │ │ │ ├── greek-mathfonts.js │ │ │ │ │ │ ├── greek-scripts.js │ │ │ │ │ │ ├── greek-small.js │ │ │ │ │ │ ├── greek-symbols.js │ │ │ │ │ │ ├── hebrew_letters.js │ │ │ │ │ │ ├── latin-lower-double-accent.js │ │ │ │ │ │ ├── latin-lower-normal.js │ │ │ │ │ │ ├── latin-lower-phonetic.js │ │ │ │ │ │ ├── latin-lower-single-accent.js │ │ │ │ │ │ ├── latin-mathfonts.js │ │ │ │ │ │ ├── latin-rest.js │ │ │ │ │ │ ├── latin-upper-double-accent.js │ │ │ │ │ │ ├── latin-upper-normal.js │ │ │ │ │ │ ├── latin-upper-single-accent.js │ │ │ │ │ │ ├── math_angles.js │ │ │ │ │ │ ├── math_arrows.js │ │ │ │ │ │ ├── math_characters.js │ │ │ │ │ │ ├── math_delimiters.js │ │ │ │ │ │ ├── math_digits.js │ │ │ │ │ │ ├── math_geometry.js │ │ │ │ │ │ ├── math_harpoons.js │ │ │ │ │ │ ├── math_non_characters.js │ │ │ │ │ │ ├── math_symbols.js │ │ │ │ │ │ ├── math_whitespace.js │ │ │ │ │ │ └── other_stars.js │ │ │ │ │ └── units/ │ │ │ │ │ ├── energy.js │ │ │ │ │ ├── length.js │ │ │ │ │ ├── memory.js │ │ │ │ │ ├── other.js │ │ │ │ │ ├── speed.js │ │ │ │ │ ├── temperature.js │ │ │ │ │ ├── time.js │ │ │ │ │ ├── volume.js │ │ │ │ │ └── weight.js │ │ │ │ ├── semantic-enrich.js │ │ │ │ └── wgxpath.install.js │ │ │ ├── asciimath2jax.js │ │ │ ├── fast-preview.js │ │ │ ├── jsMath2jax.js │ │ │ ├── mml2jax.js │ │ │ ├── tex2jax.js │ │ │ └── toMathML.js │ │ ├── jax/ │ │ │ ├── element/ │ │ │ │ └── mml/ │ │ │ │ ├── jax.js │ │ │ │ └── optable/ │ │ │ │ ├── Arrows.js │ │ │ │ ├── BasicLatin.js │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ ├── CombDiactForSymbols.js │ │ │ │ ├── Dingbats.js │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ ├── GeometricShapes.js │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ ├── Latin1Supplement.js │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ ├── MathOperators.js │ │ │ │ ├── MiscMathSymbolsA.js │ │ │ │ ├── MiscMathSymbolsB.js │ │ │ │ ├── MiscSymbolsAndArrows.js │ │ │ │ ├── MiscTechnical.js │ │ │ │ ├── SpacingModLetters.js │ │ │ │ ├── SuppMathOperators.js │ │ │ │ ├── SupplementalArrowsA.js │ │ │ │ └── SupplementalArrowsB.js │ │ │ ├── input/ │ │ │ │ ├── AsciiMath/ │ │ │ │ │ ├── config.js │ │ │ │ │ └── jax.js │ │ │ │ ├── MathML/ │ │ │ │ │ ├── config.js │ │ │ │ │ ├── entities/ │ │ │ │ │ │ ├── a.js │ │ │ │ │ │ ├── b.js │ │ │ │ │ │ ├── c.js │ │ │ │ │ │ ├── d.js │ │ │ │ │ │ ├── e.js │ │ │ │ │ │ ├── f.js │ │ │ │ │ │ ├── fr.js │ │ │ │ │ │ ├── g.js │ │ │ │ │ │ ├── h.js │ │ │ │ │ │ ├── i.js │ │ │ │ │ │ ├── j.js │ │ │ │ │ │ ├── k.js │ │ │ │ │ │ ├── l.js │ │ │ │ │ │ ├── m.js │ │ │ │ │ │ ├── n.js │ │ │ │ │ │ ├── o.js │ │ │ │ │ │ ├── opf.js │ │ │ │ │ │ ├── p.js │ │ │ │ │ │ ├── q.js │ │ │ │ │ │ ├── r.js │ │ │ │ │ │ ├── s.js │ │ │ │ │ │ ├── scr.js │ │ │ │ │ │ ├── t.js │ │ │ │ │ │ ├── u.js │ │ │ │ │ │ ├── v.js │ │ │ │ │ │ ├── w.js │ │ │ │ │ │ ├── x.js │ │ │ │ │ │ ├── y.js │ │ │ │ │ │ └── z.js │ │ │ │ │ └── jax.js │ │ │ │ └── TeX/ │ │ │ │ ├── config.js │ │ │ │ └── jax.js │ │ │ └── output/ │ │ │ ├── CommonHTML/ │ │ │ │ ├── autoload/ │ │ │ │ │ ├── annotation-xml.js │ │ │ │ │ ├── maction.js │ │ │ │ │ ├── menclose.js │ │ │ │ │ ├── mglyph.js │ │ │ │ │ ├── mmultiscripts.js │ │ │ │ │ ├── ms.js │ │ │ │ │ ├── mtable.js │ │ │ │ │ └── multiline.js │ │ │ │ ├── config.js │ │ │ │ ├── fonts/ │ │ │ │ │ └── TeX/ │ │ │ │ │ ├── AMS-Regular.js │ │ │ │ │ ├── Caligraphic-Bold.js │ │ │ │ │ ├── Fraktur-Bold.js │ │ │ │ │ ├── Fraktur-Regular.js │ │ │ │ │ ├── Main-Bold.js │ │ │ │ │ ├── Math-BoldItalic.js │ │ │ │ │ ├── SansSerif-Bold.js │ │ │ │ │ ├── SansSerif-Italic.js │ │ │ │ │ ├── SansSerif-Regular.js │ │ │ │ │ ├── Script-Regular.js │ │ │ │ │ ├── Typewriter-Regular.js │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ └── fontdata.js │ │ │ │ └── jax.js │ │ │ ├── HTML-CSS/ │ │ │ │ ├── autoload/ │ │ │ │ │ ├── annotation-xml.js │ │ │ │ │ ├── maction.js │ │ │ │ │ ├── menclose.js │ │ │ │ │ ├── mglyph.js │ │ │ │ │ ├── mmultiscripts.js │ │ │ │ │ ├── ms.js │ │ │ │ │ ├── mtable.js │ │ │ │ │ └── multiline.js │ │ │ │ ├── config.js │ │ │ │ ├── fonts/ │ │ │ │ │ ├── Asana-Math/ │ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Main/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Script/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ │ └── fontdata.js │ │ │ │ │ ├── Gyre-Pagella/ │ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Main/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Script/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ │ └── fontdata.js │ │ │ │ │ ├── Gyre-Termes/ │ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Main/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Script/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ │ └── fontdata.js │ │ │ │ │ ├── Latin-Modern/ │ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Main/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Script/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size7/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ │ └── fontdata.js │ │ │ │ │ ├── Neo-Euler/ │ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Main/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Script/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ │ └── fontdata.js │ │ │ │ │ ├── STIX/ │ │ │ │ │ │ ├── General/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ ├── AlphaPresentForms.js │ │ │ │ │ │ │ │ ├── Arrows.js │ │ │ │ │ │ │ │ ├── BBBold.js │ │ │ │ │ │ │ │ ├── BoldFraktur.js │ │ │ │ │ │ │ │ ├── BoxDrawing.js │ │ │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ │ │ ├── CombDiactForSymbols.js │ │ │ │ │ │ │ │ ├── ControlPictures.js │ │ │ │ │ │ │ │ ├── CurrencySymbols.js │ │ │ │ │ │ │ │ ├── Cyrillic.js │ │ │ │ │ │ │ │ ├── EnclosedAlphanum.js │ │ │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ │ │ ├── GeometricShapes.js │ │ │ │ │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ │ │ │ │ ├── GreekBold.js │ │ │ │ │ │ │ │ ├── GreekSSBold.js │ │ │ │ │ │ │ │ ├── IPAExtensions.js │ │ │ │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ │ │ │ ├── LatinExtendedAdditional.js │ │ │ │ │ │ │ │ ├── LatinExtendedB.js │ │ │ │ │ │ │ │ ├── LatinExtendedD.js │ │ │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ │ ├── MathBold.js │ │ │ │ │ │ │ │ ├── MathOperators.js │ │ │ │ │ │ │ │ ├── MathSSBold.js │ │ │ │ │ │ │ │ ├── MiscMathSymbolsA.js │ │ │ │ │ │ │ │ ├── MiscMathSymbolsB.js │ │ │ │ │ │ │ │ ├── MiscSymbols.js │ │ │ │ │ │ │ │ ├── MiscTechnical.js │ │ │ │ │ │ │ │ ├── NumberForms.js │ │ │ │ │ │ │ │ ├── PhoneticExtensions.js │ │ │ │ │ │ │ │ ├── SpacingModLetters.js │ │ │ │ │ │ │ │ ├── SuperAndSubscripts.js │ │ │ │ │ │ │ │ └── SuppMathOperators.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ ├── AlphaPresentForms.js │ │ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ │ │ ├── BoxDrawing.js │ │ │ │ │ │ │ │ ├── CombDiactForSymbols.js │ │ │ │ │ │ │ │ ├── ControlPictures.js │ │ │ │ │ │ │ │ ├── CurrencySymbols.js │ │ │ │ │ │ │ │ ├── Cyrillic.js │ │ │ │ │ │ │ │ ├── EnclosedAlphanum.js │ │ │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ │ │ │ │ ├── GreekBoldItalic.js │ │ │ │ │ │ │ │ ├── GreekSSBoldItalic.js │ │ │ │ │ │ │ │ ├── IPAExtensions.js │ │ │ │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ │ │ │ ├── LatinExtendedAdditional.js │ │ │ │ │ │ │ │ ├── LatinExtendedB.js │ │ │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ │ ├── MathBoldItalic.js │ │ │ │ │ │ │ │ ├── MathBoldScript.js │ │ │ │ │ │ │ │ ├── MathOperators.js │ │ │ │ │ │ │ │ ├── MathSSItalicBold.js │ │ │ │ │ │ │ │ └── SpacingModLetters.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ ├── AlphaPresentForms.js │ │ │ │ │ │ │ │ ├── BoxDrawing.js │ │ │ │ │ │ │ │ ├── CombDiactForSymbols.js │ │ │ │ │ │ │ │ ├── ControlPictures.js │ │ │ │ │ │ │ │ ├── CurrencySymbols.js │ │ │ │ │ │ │ │ ├── Cyrillic.js │ │ │ │ │ │ │ │ ├── EnclosedAlphanum.js │ │ │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ │ │ │ │ ├── GreekItalic.js │ │ │ │ │ │ │ │ ├── IPAExtensions.js │ │ │ │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ │ │ │ ├── LatinExtendedAdditional.js │ │ │ │ │ │ │ │ ├── LatinExtendedB.js │ │ │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ │ ├── MathItalic.js │ │ │ │ │ │ │ │ ├── MathOperators.js │ │ │ │ │ │ │ │ ├── MathSSItalic.js │ │ │ │ │ │ │ │ ├── MathScript.js │ │ │ │ │ │ │ │ ├── SpacingModLetters.js │ │ │ │ │ │ │ │ └── ij.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── AlphaPresentForms.js │ │ │ │ │ │ │ ├── Arrows.js │ │ │ │ │ │ │ ├── BBBold.js │ │ │ │ │ │ │ ├── BlockElements.js │ │ │ │ │ │ │ ├── BoldFraktur.js │ │ │ │ │ │ │ ├── BoxDrawing.js │ │ │ │ │ │ │ ├── CJK.js │ │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ │ ├── CombDiactForSymbols.js │ │ │ │ │ │ │ ├── ControlPictures.js │ │ │ │ │ │ │ ├── CurrencySymbols.js │ │ │ │ │ │ │ ├── Cyrillic.js │ │ │ │ │ │ │ ├── Dingbats.js │ │ │ │ │ │ │ ├── EnclosedAlphanum.js │ │ │ │ │ │ │ ├── Fraktur.js │ │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ │ ├── GeometricShapes.js │ │ │ │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ │ │ │ ├── GreekBold.js │ │ │ │ │ │ │ ├── GreekBoldItalic.js │ │ │ │ │ │ │ ├── GreekItalic.js │ │ │ │ │ │ │ ├── GreekSSBold.js │ │ │ │ │ │ │ ├── GreekSSBoldItalic.js │ │ │ │ │ │ │ ├── Hiragana.js │ │ │ │ │ │ │ ├── IPAExtensions.js │ │ │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ │ │ ├── LatinExtendedAdditional.js │ │ │ │ │ │ │ ├── LatinExtendedB.js │ │ │ │ │ │ │ ├── LatinExtendedD.js │ │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ ├── MathBold.js │ │ │ │ │ │ │ ├── MathBoldItalic.js │ │ │ │ │ │ │ ├── MathBoldScript.js │ │ │ │ │ │ │ ├── MathItalic.js │ │ │ │ │ │ │ ├── MathOperators.js │ │ │ │ │ │ │ ├── MathSS.js │ │ │ │ │ │ │ ├── MathSSBold.js │ │ │ │ │ │ │ ├── MathSSItalic.js │ │ │ │ │ │ │ ├── MathSSItalicBold.js │ │ │ │ │ │ │ ├── MathScript.js │ │ │ │ │ │ │ ├── MathTT.js │ │ │ │ │ │ │ ├── MiscMathSymbolsA.js │ │ │ │ │ │ │ ├── MiscMathSymbolsB.js │ │ │ │ │ │ │ ├── MiscSymbols.js │ │ │ │ │ │ │ ├── MiscSymbolsAndArrows.js │ │ │ │ │ │ │ ├── MiscTechnical.js │ │ │ │ │ │ │ ├── NumberForms.js │ │ │ │ │ │ │ ├── PhoneticExtensions.js │ │ │ │ │ │ │ ├── SpacingModLetters.js │ │ │ │ │ │ │ ├── Specials.js │ │ │ │ │ │ │ ├── SuperAndSubscripts.js │ │ │ │ │ │ │ ├── SuppMathOperators.js │ │ │ │ │ │ │ ├── SupplementalArrowsA.js │ │ │ │ │ │ │ ├── SupplementalArrowsB.js │ │ │ │ │ │ │ └── ij.js │ │ │ │ │ │ ├── IntegralsD/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── All.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── IntegralsSm/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── All.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── IntegralsUp/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── All.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── IntegralsUpD/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── All.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── IntegralsUpSm/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── All.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ │ └── PrivateUse.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ │ └── PrivateUse.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ │ └── PrivateUse.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ └── PrivateUse.js │ │ │ │ │ │ ├── SizeFiveSym/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SizeFourSym/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SizeOneSym/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SizeThreeSym/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SizeTwoSym/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ ├── All.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── fontdata-1.0.js │ │ │ │ │ │ ├── fontdata-beta.js │ │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ │ └── fontdata.js │ │ │ │ │ ├── STIX-Web/ │ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Main/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Script/ │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ │ └── fontdata.js │ │ │ │ │ └── TeX/ │ │ │ │ │ ├── AMS/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ ├── Arrows.js │ │ │ │ │ │ ├── BBBold.js │ │ │ │ │ │ ├── BoxDrawing.js │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ ├── Dingbats.js │ │ │ │ │ │ ├── EnclosedAlphanum.js │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ ├── GeometricShapes.js │ │ │ │ │ │ ├── GreekAndCoptic.js │ │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ ├── MathOperators.js │ │ │ │ │ │ ├── MiscMathSymbolsB.js │ │ │ │ │ │ ├── MiscSymbols.js │ │ │ │ │ │ ├── MiscTechnical.js │ │ │ │ │ │ ├── PUA.js │ │ │ │ │ │ ├── SpacingModLetters.js │ │ │ │ │ │ └── SuppMathOperators.js │ │ │ │ │ ├── Caligraphic/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ ├── Other.js │ │ │ │ │ │ │ └── PUA.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ ├── Other.js │ │ │ │ │ │ └── PUA.js │ │ │ │ │ ├── Greek/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Main/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ ├── Arrows.js │ │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ │ ├── CombDiactForSymbols.js │ │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ │ ├── GeometricShapes.js │ │ │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ │ │ ├── LatinExtendedA.js │ │ │ │ │ │ │ ├── LatinExtendedB.js │ │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ ├── MathOperators.js │ │ │ │ │ │ │ ├── MiscMathSymbolsA.js │ │ │ │ │ │ │ ├── MiscSymbols.js │ │ │ │ │ │ │ ├── MiscTechnical.js │ │ │ │ │ │ │ ├── SpacingModLetters.js │ │ │ │ │ │ │ ├── SuppMathOperators.js │ │ │ │ │ │ │ └── SupplementalArrowsA.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ │ ├── GeneralPunctuation.js │ │ │ │ │ │ │ ├── Latin1Supplement.js │ │ │ │ │ │ │ ├── LetterlikeSymbols.js │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ ├── GeometricShapes.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ ├── MiscSymbols.js │ │ │ │ │ │ └── SpacingModLetters.js │ │ │ │ │ ├── Math/ │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Italic/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ └── Other.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ │ └── Other.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ └── Other.js │ │ │ │ │ ├── Script/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ └── Other.js │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Typewriter/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ ├── BasicLatin.js │ │ │ │ │ │ ├── CombDiacritMarks.js │ │ │ │ │ │ ├── Main.js │ │ │ │ │ │ └── Other.js │ │ │ │ │ ├── WinChrome/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── WinIE6/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ ├── AMS.js │ │ │ │ │ │ ├── Bold.js │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ └── fontdata.js │ │ │ │ ├── imageFonts.js │ │ │ │ └── jax.js │ │ │ ├── NativeMML/ │ │ │ │ ├── config.js │ │ │ │ └── jax.js │ │ │ ├── PlainSource/ │ │ │ │ ├── config.js │ │ │ │ └── jax.js │ │ │ ├── PreviewHTML/ │ │ │ │ ├── config.js │ │ │ │ └── jax.js │ │ │ └── SVG/ │ │ │ ├── autoload/ │ │ │ │ ├── annotation-xml.js │ │ │ │ ├── maction.js │ │ │ │ ├── menclose.js │ │ │ │ ├── mglyph.js │ │ │ │ ├── mmultiscripts.js │ │ │ │ ├── ms.js │ │ │ │ ├── mtable.js │ │ │ │ └── multiline.js │ │ │ ├── config.js │ │ │ ├── fonts/ │ │ │ │ ├── Asana-Math/ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Main/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Script/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ └── fontdata.js │ │ │ │ ├── Gyre-Pagella/ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Main/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Script/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ └── fontdata.js │ │ │ │ ├── Gyre-Termes/ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Main/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Script/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ └── fontdata.js │ │ │ │ ├── Latin-Modern/ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Main/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Monospace/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── SansSerif/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Script/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size6/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size7/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ └── fontdata.js │ │ │ │ ├── Neo-Euler/ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Main/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Marks/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── NonUnicode/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Normal/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Operators/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Script/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Shapes/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size1/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size2/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size3/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size4/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Size5/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Symbols/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Variants/ │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── fontdata-extra.js │ │ │ │ │ └── fontdata.js │ │ │ │ ├── STIX-Web/ │ │ │ │ │ ├── Alphabets/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Arrows/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── DoubleStruck/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Fraktur/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Latin/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├── Main/ │ │ │ │ │ │ ├── Bold/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── BoldItalic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ ├── Italic/ │ │ │ │ │ │ │ └── Main.js │ │ │ │ │ │ └── Regular/ │ │ │ │ │ │ └── Main.js │ │ │ │ │ ├──
Copy disabled (too large)
Download .txt
Showing preview only (359,004K chars total). Download the full file to get everything.
SYMBOL INDEX (4474 symbols across 68 files)
FILE: case_studies/fractal/appserv/main.py
class DbError (line 51) | class DbError(Exception):
method __init__ (line 52) | def __init__(self, msg):
method __str__ (line 54) | def __str__(self):
function render_error (line 71) | def render_error(code, msg):
function db_execute (line 75) | def db_execute(s, t=()):
function my_render_template (line 95) | def my_render_template(filename, **context):
function db_clear (line 99) | def db_clear():
function db_partition (line 102) | def db_partition(dt):
function db_remember (line 106) | def db_remember(text, x, y, level):
function db_list (line 113) | def db_list():
function default_handler (line 136) | def default_handler():
function cleardb_handler (line 141) | def cleardb_handler():
function remember_handler (line 150) | def remember_handler():
function remembered_list_handler (line 170) | def remembered_list_handler():
function error_404 (line 179) | def error_404(error):
function error_500 (line 184) | def error_500(error):
FILE: case_studies/fractal/tilegen/mandelbrot.cpp
function main (line 28) | int main(int argc, const char **argv)
FILE: case_studies/fractal/tilegen/mandelbrot_service.py
function handle_fractal (line 46) | def handle_fractal():
function handle_thumb (line 83) | def handle_thumb():
FILE: case_studies/kubernetes/test_same.py
function jsonstr (line 30) | def jsonstr(v):
function canonicalize (line 33) | def canonicalize(doc):
FILE: case_studies/micro_fractal/appserv/main.py
class DbError (line 52) | class DbError(Exception):
method __init__ (line 53) | def __init__(self, msg):
method __str__ (line 55) | def __str__(self):
function render_error (line 72) | def render_error(code, msg):
function db_execute (line 76) | def db_execute(s, t=()):
function my_render_template (line 96) | def my_render_template(filename, **context):
function db_clear (line 100) | def db_clear():
function db_partition (line 103) | def db_partition(dt):
function db_remember (line 107) | def db_remember(text, x, y, level):
function db_list (line 114) | def db_list():
function default_handler (line 137) | def default_handler():
function cleardb_handler (line 142) | def cleardb_handler():
function remember_handler (line 151) | def remember_handler():
function remembered_list_handler (line 171) | def remembered_list_handler():
function error_404 (line 180) | def error_404(error):
function error_500 (line 185) | def error_500(error):
FILE: case_studies/micro_fractal/tilegen/mandelbrot.cpp
function main (line 28) | int main(int argc, const char **argv)
FILE: case_studies/micro_fractal/tilegen/mandelbrot_service.py
function check_etag (line 60) | def check_etag():
function handle_fractal (line 66) | def handle_fractal():
function handle_thumb (line 107) | def handle_thumb():
FILE: case_studies/micromanage/build_artefact.py
class BuildArtefact (line 16) | class BuildArtefact(object):
method name (line 17) | def name(self):
method needsBuild (line 20) | def needsBuild(self):
method getOutputFiles (line 23) | def getOutputFiles(self, dirpath):
method outputFiles (line 26) | def outputFiles(self, dirpath):
method doBuild (line 29) | def doBuild(self, dirpath):
method wait (line 32) | def wait(self):
method postBuild (line 35) | def postBuild(self):
FILE: case_studies/micromanage/cmds.py
function escape (line 19) | def escape(s):
function file_glob (line 22) | def file_glob(given_glob, to, prefix):
function compile_command_to_bash (line 35) | def compile_command_to_bash(cmd):
FILE: case_studies/micromanage/micromanage.py
function get_compiler (line 42) | def get_compiler(config, service):
function config_check_service (line 48) | def config_check_service(environments, root, path):
function services (line 72) | def services(config):
function config_check (line 78) | def config_check(config):
function jsonnet_try_path (line 104) | def jsonnet_try_path(dir, rel):
function jsonnet_import_callback (line 120) | def jsonnet_import_callback(dir, rel):
function config_load (line 131) | def config_load(filename, ext_vars):
function preprocess (line 158) | def preprocess(config):
function get_build_artefacts (line 178) | def get_build_artefacts(config):
function compile (line 202) | def compile(config, barts):
function confirmation_dialog (line 249) | def confirmation_dialog(msg):
function output_delete (line 261) | def output_delete(dirpath):
function action_blueprint (line 265) | def action_blueprint(config_file, config, args):
function generate (line 272) | def generate(dirpath, config, do_build):
class SubprocessException (line 316) | class SubprocessException(Exception):
function sync_popen (line 319) | def sync_popen(dirpath, command, successful_exit_codes=(0,), stdout=None):
function action_generate_to_editor (line 329) | def action_generate_to_editor(config_file, config, args):
function action_diff (line 338) | def action_diff(config_file, config, args):
function action_apply (line 352) | def action_apply(config_file, config, args):
function action_destroy (line 381) | def action_destroy(config_file, config, args):
function action_graph (line 399) | def action_graph(config_file, config, args):
function action_init (line 410) | def action_init(config_file, config, args):
function action_list_services (line 424) | def action_list_services(config_file, config, args):
function action_show (line 446) | def action_show(config_file, config, args):
function action_output (line 460) | def action_output(config_file, config, args):
function action_image_gc (line 472) | def action_image_gc(config_file, config, args):
function print_usage (line 547) | def print_usage(channel):
function next_arg (line 554) | def next_arg(i):
FILE: case_studies/micromanage/packer.py
function hash_code_as_domain_name (line 26) | def hash_code_as_domain_name(n):
function hash_string (line 39) | def hash_string(s):
function hash_cmds (line 46) | def hash_cmds(cmds):
class PackerBuildArtefact (line 76) | class PackerBuildArtefact(build_artefact.BuildArtefact):
method __init__ (line 77) | def __init__(self, cmds):
method builderHashCode (line 82) | def builderHashCode(self):
method hashCode (line 85) | def hashCode(self):
method _configFileName (line 90) | def _configFileName(self):
method _config (line 93) | def _config(self):
method name (line 104) | def name(self):
method getOutputFiles (line 107) | def getOutputFiles(self, dirpath):
method outputFiles (line 110) | def outputFiles(self, dirpath):
method doBuild (line 116) | def doBuild(self, dirpath):
method wait (line 127) | def wait(self, dirpath):
FILE: case_studies/micromanage/service.py
class Service (line 20) | class Service(object):
method validateCmds (line 22) | def validateCmds(self, root, path):
method validateImage (line 52) | def validateImage(self, root, path):
method children (line 57) | def children(self, service):
method validateInfrastructure (line 63) | def validateInfrastructure(self, root, service_name, path):
method validateService (line 73) | def validateService(self, root, path):
method fullName (line 77) | def fullName(self, path):
method preprocess (line 80) | def preprocess(self, service):
method compileStartupScript (line 87) | def compileStartupScript(self, cmds, bootCmds):
FILE: case_studies/micromanage/service_amazon.py
function amazon_get_amis (line 29) | def amazon_get_amis(region_name, aws_access_key_id, aws_secret_access_key):
function amazon_get_ami_by_name (line 36) | def amazon_get_ami_by_name(region_name, aws_access_key_id, aws_secret_ac...
class AmazonPackerBuildArtefact (line 46) | class AmazonPackerBuildArtefact(packer.PackerBuildArtefact):
method __init__ (line 47) | def __init__(self, image, environment):
method builderHashCode (line 58) | def builderHashCode(self):
method builder (line 64) | def builder(self):
method needsBuild (line 77) | def needsBuild(self):
method doBuild (line 88) | def doBuild(self, dirpath):
method postBuild (line 94) | def postBuild(self):
class AmazonService (line 98) | class AmazonService(service.Service):
method validateEnvironment (line 100) | def validateEnvironment(self, root, path):
method validateService (line 107) | def validateService(self, root, path):
method validateImage (line 122) | def validateImage(self, root, path):
method compileProvider (line 129) | def compileProvider(self, environment_name, environment):
method getBuildArtefacts (line 143) | def getBuildArtefacts(self, environment, ctx, service):
method compile (line 160) | def compile(self, ctx, service_name, service, barts):
FILE: case_studies/micromanage/service_google.py
function google_get_images_json_key (line 31) | def google_get_images_json_key(project, key_json):
class GooglePackerBuildArtefact (line 41) | class GooglePackerBuildArtefact(packer.PackerBuildArtefact):
method __init__ (line 42) | def __init__(self, image, environment):
method builderHashCode (line 52) | def builderHashCode(self):
method builder (line 59) | def builder(self):
method needsBuild (line 75) | def needsBuild(self):
method doBuild (line 84) | def doBuild(self, dirpath):
method postBuild (line 90) | def postBuild(self):
class GoogleService (line 94) | class GoogleService(service.Service):
method validateEnvironment (line 96) | def validateEnvironment(self, root, path):
method validateService (line 112) | def validateService(self, root, path):
method validateImage (line 137) | def validateImage(self, root, path):
method compileProvider (line 144) | def compileProvider(self, environment_name, environment):
method getBuildArtefacts (line 158) | def getBuildArtefacts(self, environment, ctx, service):
method compile (line 182) | def compile(self, ctx, service_name, service, barts):
FILE: case_studies/micromanage/util.py
function jsonstr (line 19) | def jsonstr(v):
function utc_now (line 22) | def utc_now():
function merge_into (line 34) | def merge_into(a, b):
FILE: case_studies/micromanage/validate.py
class ConfigError (line 19) | class ConfigError (Exception):
method __init__ (line 20) | def __init__(self, msg, note):
function render_path (line 25) | def render_path(path):
function err (line 37) | def err(path, msg, note=None):
function _isidentifier (line 45) | def _isidentifier(name):
function _type_err (line 57) | def _type_err(v):
function _type_str (line 66) | def _type_str(v):
class _Empty (line 80) | class _Empty:
function _resolve_path (line 87) | def _resolve_path(root, path, default=_NO_DEFAULT):
function is_string_map (line 97) | def is_string_map(v):
function _set_str (line 108) | def _set_str(s):
function is_any_type (line 111) | def is_any_type(types):
function is_type (line 117) | def is_type(t):
function is_value (line 123) | def is_value(expected):
function is_any_value (line 129) | def is_any_value(expected):
function _sanitize_func (line 139) | def _sanitize_func(func):
function path_val (line 145) | def path_val(root, path, func, default=None):
function array (line 154) | def array(root, path, element_func, default):
function obj_only (line 163) | def obj_only(root, path, fields, default=None):
FILE: cmd/jsonnet.cpp
function version (line 42) | void version(std::ostream &o)
function usage (line 47) | void usage(std::ostream &o)
type JsonnetConfig (line 98) | struct JsonnetConfig {
method JsonnetConfig (line 108) | JsonnetConfig()
function get_var_val (line 116) | bool get_var_val(const std::string &var_val, std::string &var, std::stri...
function get_var_file (line 134) | bool get_var_file(const std::string &var_file, const std::string &imp, s...
type ArgStatus (line 156) | enum ArgStatus {
function ArgStatus (line 165) | static ArgStatus process_args(int argc, const char **argv, JsonnetConfig...
function write_multi_output_files (line 363) | static bool write_multi_output_files(JsonnetVm *vm, char *output, const ...
function write_output_stream (line 448) | static bool write_output_stream(JsonnetVm *vm, char *output, const std::...
function main (line 499) | int main(int argc, const char **argv)
FILE: cmd/jsonnetfmt.cpp
function version (line 36) | void version(std::ostream &o)
function usage (line 41) | void usage(std::ostream &o)
type JsonnetConfig (line 74) | struct JsonnetConfig {
method JsonnetConfig (line 82) | JsonnetConfig()
type ArgStatus (line 90) | enum ArgStatus {
function ArgStatus (line 99) | static ArgStatus process_args(int argc, const char **argv, JsonnetConfig...
function main (line 217) | int main(int argc, const char **argv)
FILE: cmd/utils.cpp
function strtol_check (line 22) | long strtol_check(const std::string &str)
function next_arg (line 34) | std::string next_arg(unsigned &i, const std::vector<std::string> &args)
function simplify_args (line 44) | std::vector<std::string> simplify_args(int argc, const char **argv)
function read_input_content (line 68) | bool read_input_content(std::string filename, std::string *input)
function change_special_filename (line 91) | void change_special_filename(bool filename_is_code, std::string *filename)
function read_input (line 100) | bool read_input(
function write_output_file (line 116) | bool write_output_file(const char *output, const std::string &output_file)
FILE: cpp/libjsonnet++.cpp
type jsonnet (line 19) | namespace jsonnet {
type JsonnetVm (line 37) | struct JsonnetVm
function parseMultiOutput (line 133) | void parseMultiOutput(const char* jsonnet_output, std::map<std::string...
FILE: cpp/libjsonnet++_test.cpp
type jsonnet (line 27) | namespace jsonnet {
class TestInSourceDir (line 29) | class TestInSourceDir : public testing::Test {
method SetUpTestSuite (line 31) | static void SetUpTestSuite() {
method TearDownTestSuite (line 40) | static void TearDownTestSuite() {
function readFile (line 50) | std::string readFile(const std::string& path)
function TEST_F (line 60) | TEST_F(TestInSourceDir, TestEvaluateSnippet)
function TEST_F (line 73) | TEST_F(TestInSourceDir, TestEvaluateInvalidSnippet)
function TEST_F (line 86) | TEST_F(TestInSourceDir, TestEvaluateFile)
function TEST_F (line 98) | TEST_F(TestInSourceDir, TestEvaluateInvalidFile)
function TEST_F (line 110) | TEST_F(TestInSourceDir, TestAddImportPath)
FILE: cpp/libjsonnet_locale_test.cpp
class Punctuator (line 12) | class Punctuator : public std::numpunct<char> {
method do_decimal_point (line 14) | virtual char do_decimal_point() const override { return '!'; }
method do_grouping (line 15) | virtual std::string do_grouping() const override { return "\1\2"; }
method do_thousands_sep (line 16) | virtual char do_thousands_sep() const override { return '\''; }
class TestWithModifiedGlobalLocale (line 19) | class TestWithModifiedGlobalLocale : public testing::Test {
method TestWithModifiedGlobalLocale (line 21) | TestWithModifiedGlobalLocale():
method SetUp (line 24) | void SetUp() override {
method TearDown (line 27) | void TearDown() override {
function TEST_F (line 35) | TEST_F(TestWithModifiedGlobalLocale, Test) {
FILE: doc/js/demo.js
function textarea_content_height (line 1) | function textarea_content_height(textarea) {
function resize_textarea (line 16) | function resize_textarea(textarea) {
function resize_textarea_max (line 22) | function resize_textarea_max(max_height, output_textarea) {
function fix_textarea (line 35) | function fix_textarea(output_textarea) {
function aux_demo (line 62) | function aux_demo(input_id, input_files, main_file, output_id, process_f...
function tab_input_click (line 215) | function tab_input_click(tab, editor_div_id) {
function tab_output_click (line 233) | function tab_output_click(tab, output_id) {
function handle_parsed_content (line 251) | function handle_parsed_content(parsed_content, string_out) {
function demo (line 275) | async function demo(input_id, input_files, main_file, output_id, multi, ...
function fmt_demo (line 322) | function fmt_demo(input_id, textarea_id, filename, output_id) {
function yaml_conv_demo (line 342) | function yaml_conv_demo(input_id, textarea_id, filename, output_id) {
FILE: doc/js/menu.js
function set_visible (line 3) | function set_visible(menu, b)
function find_enclosing_menu (line 13) | function find_enclosing_menu(el)
function menu_open_popup (line 22) | function menu_open_popup(el)
function menu_leave (line 28) | function menu_leave()
function menu_close_all (line 36) | function menu_close_all()
FILE: doc/js/wasm_exec.js
method writeSync (line 18) | writeSync(fd, buf) {
method write (line 27) | write(fd, buf, offset, length, position, callback) {
method chmod (line 35) | chmod(path, mode, callback) { callback(enosys()); }
method chown (line 36) | chown(path, uid, gid, callback) { callback(enosys()); }
method close (line 37) | close(fd, callback) { callback(enosys()); }
method fchmod (line 38) | fchmod(fd, mode, callback) { callback(enosys()); }
method fchown (line 39) | fchown(fd, uid, gid, callback) { callback(enosys()); }
method fstat (line 40) | fstat(fd, callback) { callback(enosys()); }
method fsync (line 41) | fsync(fd, callback) { callback(null); }
method ftruncate (line 42) | ftruncate(fd, length, callback) { callback(enosys()); }
method lchown (line 43) | lchown(path, uid, gid, callback) { callback(enosys()); }
method link (line 44) | link(path, link, callback) { callback(enosys()); }
method lstat (line 45) | lstat(path, callback) { callback(enosys()); }
method mkdir (line 46) | mkdir(path, perm, callback) { callback(enosys()); }
method open (line 47) | open(path, flags, mode, callback) { callback(enosys()); }
method read (line 48) | read(fd, buffer, offset, length, position, callback) { callback(enosys()...
method readdir (line 49) | readdir(path, callback) { callback(enosys()); }
method readlink (line 50) | readlink(path, callback) { callback(enosys()); }
method rename (line 51) | rename(from, to, callback) { callback(enosys()); }
method rmdir (line 52) | rmdir(path, callback) { callback(enosys()); }
method stat (line 53) | stat(path, callback) { callback(enosys()); }
method symlink (line 54) | symlink(path, link, callback) { callback(enosys()); }
method truncate (line 55) | truncate(path, length, callback) { callback(enosys()); }
method unlink (line 56) | unlink(path, callback) { callback(enosys()); }
method utimes (line 57) | utimes(path, atime, mtime, callback) { callback(enosys()); }
method getuid (line 63) | getuid() { return -1; }
method getgid (line 64) | getgid() { return -1; }
method geteuid (line 65) | geteuid() { return -1; }
method getegid (line 66) | getegid() { return -1; }
method getgroups (line 67) | getgroups() { throw enosys(); }
method umask (line 70) | umask() { throw enosys(); }
method cwd (line 71) | cwd() { throw enosys(); }
method chdir (line 72) | chdir() { throw enosys(); }
method constructor (line 96) | constructor() {
method run (line 465) | async run(instance) {
method _resume (line 541) | _resume() {
method _makeFuncWrapper (line 551) | _makeFuncWrapper(id) {
FILE: doc/third_party/CodeMirror/addon/edit/matchbrackets.js
function findMatchingBracket (line 19) | function findMatchingBracket(cm, where, config) {
function scanForBracket (line 49) | function scanForBracket(cm, where, dir, style, config) {
function matchBrackets (line 76) | function matchBrackets(cm, autoclear, config) {
function doMatchBrackets (line 106) | function doMatchBrackets(cm) {
FILE: doc/third_party/CodeMirror/lib/codemirror.js
function classTest (line 50) | function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)...
function removeChildren (line 61) | function removeChildren(e) {
function removeChildrenAndAdd (line 67) | function removeChildrenAndAdd(parent, e) {
function elt (line 71) | function elt(tag, content, className, style) {
function eltP (line 80) | function eltP(tag, content, className, style) {
function contains (line 103) | function contains(parent, child) {
function activeElt (line 114) | function activeElt() {
function addClass (line 129) | function addClass(node, cls) {
function joinClasses (line 133) | function joinClasses(a, b) {
function bind (line 146) | function bind(f) {
function copyObj (line 151) | function copyObj(obj, target, overwrite) {
function countColumn (line 161) | function countColumn(string, end, tabSize, startIndex, startValue) {
function indexOf (line 182) | function indexOf(array, elt) {
function findColumn (line 202) | function findColumn(string, goal, tabSize) {
function spaceStr (line 217) | function spaceStr(n) {
function lst (line 223) | function lst(arr) { return arr[arr.length-1] }
function map (line 225) | function map(array, f) {
function insertSorted (line 231) | function insertSorted(array, value, score) {
function nothing (line 237) | function nothing() {}
function createObj (line 239) | function createObj(base, props) {
function isWordCharBasic (line 252) | function isWordCharBasic(ch) {
function isWordChar (line 256) | function isWordChar(ch, helper) {
function isEmpty (line 262) | function isEmpty(obj) {
function isExtendingChar (line 273) | function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendi...
function skipExtendingChars (line 276) | function skipExtendingChars(str, pos, dir) {
function findFirst (line 284) | function findFirst(pred, from, to) {
function Display (line 301) | function Display(place, doc, input) {
function getLine (line 401) | function getLine(doc, n) {
function getBetween (line 417) | function getBetween(doc, start, end) {
function getLines (line 429) | function getLines(doc, from, to) {
function updateLineHeight (line 437) | function updateLineHeight(line, height) {
function lineNo (line 444) | function lineNo(line) {
function lineAtHeight (line 458) | function lineAtHeight(chunk, h) {
function isLine (line 478) | function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}
function lineNumberFor (line 480) | function lineNumberFor(options, i) {
function Pos (line 485) | function Pos(line, ch, sticky) {
function cmp (line 496) | function cmp(a, b) { return a.line - b.line || a.ch - b.ch }
function equalCursorPos (line 498) | function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b)...
function copyPos (line 500) | function copyPos(x) {return Pos(x.line, x.ch)}
function maxPos (line 501) | function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }
function minPos (line 502) | function minPos(a, b) { return cmp(a, b) < 0 ? a : b }
function clipLine (line 506) | function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.fi...
function clipPos (line 507) | function clipPos(doc, pos) {
function clipToLen (line 513) | function clipToLen(pos, linelen) {
function clipPosArray (line 519) | function clipPosArray(doc, array) {
function seeReadOnlySpans (line 529) | function seeReadOnlySpans() {
function seeCollapsedSpans (line 533) | function seeCollapsedSpans() {
function MarkedSpan (line 539) | function MarkedSpan(marker, from, to) {
function getMarkedSpanFor (line 545) | function getMarkedSpanFor(spans, marker) {
function removeMarkedSpan (line 553) | function removeMarkedSpan(spans, span) {
function addMarkedSpan (line 560) | function addMarkedSpan(line, span) {
function markedSpansBefore (line 569) | function markedSpansBefore(old, startCh, isInsert) {
function markedSpansAfter (line 580) | function markedSpansAfter(old, endCh, isInsert) {
function stretchSpansOverChange (line 599) | function stretchSpansOverChange(doc, change) {
function clearEmptySpans (line 661) | function clearEmptySpans(spans) {
function removeReadOnlyRanges (line 672) | function removeReadOnlyRanges(doc, from, to) {
function detachMarkedSpans (line 701) | function detachMarkedSpans(line) {
function attachMarkedSpans (line 708) | function attachMarkedSpans(line, spans) {
function extraLeft (line 717) | function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }
function extraRight (line 718) | function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }
function compareCollapsedMarkers (line 723) | function compareCollapsedMarkers(a, b) {
function collapsedSpanAtSide (line 736) | function collapsedSpanAtSide(line, start) {
function collapsedSpanAtStart (line 746) | function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, t...
function collapsedSpanAtEnd (line 747) | function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, fal...
function conflictingCollapsedRange (line 752) | function conflictingCollapsedRange(doc, lineNo$$1, from, to, marker) {
function visualLine (line 772) | function visualLine(line) {
function visualLineEnd (line 779) | function visualLineEnd(line) {
function visualLineContinued (line 788) | function visualLineContinued(line) {
function visualLineNo (line 799) | function visualLineNo(doc, lineN) {
function visualLineEndNo (line 807) | function visualLineEndNo(doc, lineN) {
function lineIsHidden (line 819) | function lineIsHidden(doc, line) {
function lineIsHiddenInner (line 830) | function lineIsHiddenInner(doc, line, span) {
function heightAtLine (line 847) | function heightAtLine(lineObj) {
function lineLength (line 869) | function lineLength(line) {
function findMaxLine (line 888) | function findMaxLine(cm) {
function iterateBidiSections (line 904) | function iterateBidiSections(order, from, to, f) {
function getBidiPartAt (line 918) | function getBidiPartAt(order, ch, sticky) {
function charType (line 964) | function charType(code) {
function BidiSpan (line 977) | function BidiSpan(level, from, to) {
function getOrder (line 1109) | function getOrder(line, direction) {
function getHandlers (line 1133) | function getHandlers(emitter, type) {
function off (line 1137) | function off(emitter, type, f) {
function signal (line 1152) | function signal(emitter, type /*, values...*/) {
function signalDOMEvent (line 1162) | function signalDOMEvent(cm, e, override) {
function signalCursorActivity (line 1169) | function signalCursorActivity(cm) {
function hasHandler (line 1177) | function hasHandler(emitter, type) {
function eventMixin (line 1183) | function eventMixin(ctor) {
function e_preventDefault (line 1191) | function e_preventDefault(e) {
function e_stopPropagation (line 1195) | function e_stopPropagation(e) {
function e_defaultPrevented (line 1199) | function e_defaultPrevented(e) {
function e_stop (line 1202) | function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
function e_target (line 1204) | function e_target(e) {return e.target || e.srcElement}
function e_button (line 1205) | function e_button(e) {
function zeroWidthElement (line 1226) | function zeroWidthElement(measure) {
function hasBadBidiRects (line 1241) | function hasBadBidiRects(measure) {
function hasBadZoomedRects (line 1290) | function hasBadZoomedRects(measure) {
function defineMode (line 1305) | function defineMode(name, mode) {
function defineMIME (line 1311) | function defineMIME(mime, spec) {
function resolveMode (line 1317) | function resolveMode(spec) {
function getMode (line 1336) | function getMode(options, spec) {
function extendMode (line 1360) | function extendMode(mode, properties) {
function copyState (line 1365) | function copyState(mode, state) {
function innerMode (line 1379) | function innerMode(mode, state) {
function startState (line 1390) | function startState(mode, a1, a2) {
function highlightLine (line 1534) | function highlightLine(cm, line, context, forceToEnd) {
function getLineStyles (line 1579) | function getLineStyles(cm, line, updateFrontier) {
function getContextBefore (line 1595) | function getContextBefore(cm, n, precise) {
function processLine (line 1615) | function processLine(cm, text, context, startAt) {
function callBlankLine (line 1626) | function callBlankLine(mode, state) {
function readToken (line 1633) | function readToken(mode, stream, state, inner) {
function takeToken (line 1650) | function takeToken(cm, pos, precise, asArray) {
function extractLineClasses (line 1664) | function extractLineClasses(type, output) {
function runMode (line 1679) | function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {
function findStartLine (line 1723) | function findStartLine(cm, n, precise) {
function retreatFrontier (line 1740) | function retreatFrontier(doc, n) {
function updateLine (line 1773) | function updateLine(line, text, markedSpans, estimateHeight) {
function cleanUpLine (line 1785) | function cleanUpLine(line) {
function interpretTokenStyle (line 1795) | function interpretTokenStyle(style, options) {
function buildLineContent (line 1807) | function buildLineContent(cm, lineView) {
function defaultSpecialCharPlaceholder (line 1865) | function defaultSpecialCharPlaceholder(ch) {
function buildToken (line 1874) | function buildToken(builder, text, style, startStyle, endStyle, title, c...
function splitSpaces (line 1936) | function splitSpaces(text, trailingBefore) {
function buildTokenBadBidi (line 1951) | function buildTokenBadBidi(inner, order) {
function buildCollapsedSpan (line 1971) | function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
function insertLineContent (line 1989) | function insertLineContent(line, builder, styles) {
function LineView (line 2061) | function LineView(doc, line, lineN) {
function buildViewArray (line 2073) | function buildViewArray(cm, from, to) {
function pushOperation (line 2085) | function pushOperation(op) {
function fireCallbacksForOps (line 2096) | function fireCallbacksForOps(group) {
function finishOperation (line 2112) | function finishOperation(op, endCb) {
function signalLater (line 2132) | function signalLater(emitter, type /*, values...*/) {
function fireOrphanDelayed (line 2152) | function fireOrphanDelayed() {
function updateLineForChanges (line 2161) | function updateLineForChanges(cm, lineView, lineN, dims) {
function ensureLineWrapped (line 2174) | function ensureLineWrapped(lineView) {
function updateLineBackground (line 2185) | function updateLineBackground(cm, lineView) {
function getLineContent (line 2200) | function getLineContent(cm, lineView) {
function updateLineText (line 2213) | function updateLineText(cm, lineView) {
function updateLineClasses (line 2228) | function updateLineClasses(cm, lineView) {
function updateLineGutter (line 2238) | function updateLineGutter(cm, lineView, lineN, dims) {
function updateLineWidgets (line 2276) | function updateLineWidgets(cm, lineView, dims) {
function buildLineElement (line 2287) | function buildLineElement(cm, lineView, lineN, dims) {
function insertLineWidgets (line 2301) | function insertLineWidgets(cm, lineView, dims) {
function insertLineWidgetsFor (line 2307) | function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
function positionLineWidget (line 2323) | function positionLineWidget(widget, node, lineView, dims) {
function widgetHeight (line 2341) | function widgetHeight(widget) {
function eventInWidget (line 2357) | function eventInWidget(display, e) {
function paddingTop (line 2367) | function paddingTop(display) {return display.lineSpace.offsetTop}
function paddingVert (line 2368) | function paddingVert(display) {return display.mover.offsetHeight - displ...
function paddingH (line 2369) | function paddingH(display) {
function scrollGap (line 2378) | function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }
function displayWidth (line 2379) | function displayWidth(cm) {
function displayHeight (line 2382) | function displayHeight(cm) {
function ensureLineHeights (line 2390) | function ensureLineHeights(cm, lineView, rect) {
function mapFromLineView (line 2411) | function mapFromLineView(lineView, line, lineN) {
function updateExternalMeasurement (line 2424) | function updateExternalMeasurement(cm, line) {
function measureChar (line 2437) | function measureChar(cm, line, ch, bias) {
function findViewForLine (line 2442) | function findViewForLine(cm, lineN) {
function prepareMeasureForLine (line 2455) | function prepareMeasureForLine(cm, line) {
function measureCharPrepared (line 2477) | function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
function nodeAndOffsetInLineMap (line 2499) | function nodeAndOffsetInLineMap(map$$1, ch, bias) {
function getUsefulRect (line 2537) | function getUsefulRect(rects, bias) {
function measureCharInner (line 2547) | function measureCharInner(cm, prepared, ch, bias) {
function maybeUpdateRectForZooming (line 2600) | function maybeUpdateRectForZooming(measure, rect) {
function clearLineMeasurementCacheFor (line 2610) | function clearLineMeasurementCacheFor(lineView) {
function clearLineMeasurementCache (line 2619) | function clearLineMeasurementCache(cm) {
function clearCaches (line 2626) | function clearCaches(cm) {
function pageScrollX (line 2633) | function pageScrollX() {
function pageScrollY (line 2640) | function pageScrollY() {
function widgetTopHeight (line 2645) | function widgetTopHeight(lineObj) {
function intoCoordSystem (line 2656) | function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {
function fromCoordSystem (line 2678) | function fromCoordSystem(cm, coords, context) {
function charCoords (line 2695) | function charCoords(cm, pos, context, lineObj, bias) {
function cursorCoords (line 2716) | function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHei...
function estimateCoords (line 2747) | function estimateCoords(cm, pos) {
function PosWithInfo (line 2762) | function PosWithInfo(line, ch, sticky, outside, xRel) {
function coordsChar (line 2771) | function coordsChar(cm, x, y) {
function wrappedLineExtent (line 2792) | function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {
function wrappedLineExtentChar (line 2800) | function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {
function boxIsAfter (line 2808) | function boxIsAfter(box, x, y, left) {
function coordsCharInner (line 2812) | function coordsCharInner(cm, lineObj, lineNo$$1, x, y) {
function coordsBidiPart (line 2879) | function coordsBidiPart(cm, lineObj, lineNo$$1, preparedMeasure, order, ...
function coordsBidiPartWrapped (line 2903) | function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, or...
function textHeight (line 2938) | function textHeight(display) {
function charWidth (line 2958) | function charWidth(display) {
function getDimensions (line 2970) | function getDimensions(cm) {
function compensateForHScroll (line 2987) | function compensateForHScroll(display) {
function estimateHeight (line 2994) | function estimateHeight(cm) {
function estimateLineHeights (line 3012) | function estimateLineHeights(cm) {
function posFromMouse (line 3025) | function posFromMouse(cm, e, liberal, forRect) {
function findViewIndex (line 3043) | function findViewIndex(cm, n) {
function updateSelection (line 3054) | function updateSelection(cm) {
function prepareSelection (line 3058) | function prepareSelection(cm, primary) {
function drawSelectionCursor (line 3079) | function drawSelectionCursor(cm, head, output) {
function cmpCoords (line 3097) | function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }
function drawSelectionRange (line 3100) | function drawSelectionRange(cm, range$$1, output) {
function restartBlink (line 3193) | function restartBlink(cm) {
function ensureFocus (line 3206) | function ensureFocus(cm) {
function delayBlurEvent (line 3210) | function delayBlurEvent(cm) {
function onFocus (line 3218) | function onFocus(cm, e) {
function onBlur (line 3237) | function onBlur(cm, e) {
function updateHeightsInViewport (line 3251) | function updateHeightsInViewport(cm) {
function updateWidgetHeight (line 3278) | function updateWidgetHeight(line) {
function visibleLines (line 3286) | function visibleLines(display, doc, viewport) {
function alignHorizontally (line 3309) | function alignHorizontally(cm) {
function maybeUpdateLineNumberWidth (line 3332) | function maybeUpdateLineNumberWidth(cm) {
function maybeScrollWindow (line 3354) | function maybeScrollWindow(cm, rect) {
function scrollPosIntoView (line 3371) | function scrollPosIntoView(cm, pos, end, margin) {
function scrollIntoView (line 3405) | function scrollIntoView(cm, rect) {
function calculateScrollPos (line 3415) | function calculateScrollPos(cm, rect) {
function addToScrollTop (line 3445) | function addToScrollTop(cm, top) {
function ensureCursorVisible (line 3453) | function ensureCursorVisible(cm) {
function scrollToCoords (line 3459) | function scrollToCoords(cm, x, y) {
function scrollToRange (line 3465) | function scrollToRange(cm, range$$1) {
function resolveScrollToPos (line 3474) | function resolveScrollToPos(cm) {
function scrollToCoordsRange (line 3483) | function scrollToCoordsRange(cm, from, to, margin) {
function updateScrollTop (line 3495) | function updateScrollTop(cm, val) {
function setScrollTop (line 3503) | function setScrollTop(cm, val, forceScroll) {
function setScrollLeft (line 3513) | function setScrollLeft(cm, val, isScroller, forceScroll) {
function measureForScrollbars (line 3526) | function measureForScrollbars(cm) {
function maybeDisable (line 3617) | function maybeDisable() {
function updateScrollbars (line 3646) | function updateScrollbars(cm, measure) {
function updateScrollbarsInner (line 3660) | function updateScrollbarsInner(cm, measure) {
function initScrollbars (line 3682) | function initScrollbars(cm) {
function startOperation (line 3712) | function startOperation(cm) {
function endOperation (line 3734) | function endOperation(cm) {
function endOperations (line 3745) | function endOperations(group) {
function endOperation_R1 (line 3759) | function endOperation_R1(op) {
function endOperation_W1 (line 3772) | function endOperation_W1(op) {
function endOperation_R2 (line 3776) | function endOperation_R2(op) {
function endOperation_W2 (line 3797) | function endOperation_W2(op) {
function endOperation_finish (line 3822) | function endOperation_finish(op) {
function runInOp (line 3861) | function runInOp(cm, f) {
function operation (line 3868) | function operation(cm, f) {
function methodOp (line 3878) | function methodOp(f) {
function docMethodOp (line 3886) | function docMethodOp(f) {
function regChange (line 3902) | function regChange(cm, from, to, lendiff) {
function regLineChange (line 3967) | function regLineChange(cm, line, type) {
function resetView (line 3981) | function resetView(cm) {
function viewCuttingPoint (line 3987) | function viewCuttingPoint(cm, oldN, newN, dir) {
function adjustView (line 4014) | function adjustView(cm, from, to) {
function countDirtyView (line 4035) | function countDirtyView(cm) {
function startWorker (line 4046) | function startWorker(cm, time) {
function highlightWorker (line 4051) | function highlightWorker(cm) {
function maybeClipScrollbars (line 4121) | function maybeClipScrollbars(cm) {
function selectionSnapshot (line 4132) | function selectionSnapshot(cm) {
function restoreSelection (line 4149) | function restoreSelection(snapshot) {
function updateDisplayIfNeeded (line 4165) | function updateDisplayIfNeeded(cm, update) {
function postUpdateDisplay (line 4237) | function postUpdateDisplay(cm, update) {
function updateDisplaySimple (line 4267) | function updateDisplaySimple(cm, viewport) {
function patchDisplay (line 4284) | function patchDisplay(cm, updateNumbersFrom, dims) {
function updateGutterSpace (line 4326) | function updateGutterSpace(cm) {
function setDocumentHeight (line 4331) | function setDocumentHeight(cm, measure) {
function updateGutters (line 4339) | function updateGutters(cm) {
function setGuttersForLineNumbers (line 4357) | function setGuttersForLineNumbers(options) {
function wheelEventDelta (line 4389) | function wheelEventDelta(e) {
function wheelEventPixels (line 4396) | function wheelEventPixels(e) {
function onScrollWheel (line 4403) | function onScrollWheel(cm, e) {
function normalizeSelection (line 4542) | function normalizeSelection(ranges, primIndex) {
function simpleSelection (line 4558) | function simpleSelection(anchor, head) {
function changeEnd (line 4564) | function changeEnd(change) {
function adjustForChange (line 4572) | function adjustForChange(pos, change) {
function computeSelAfterChange (line 4581) | function computeSelAfterChange(doc, change) {
function offsetPos (line 4591) | function offsetPos(pos, old, nw) {
function computeReplacedSel (line 4600) | function computeReplacedSel(doc, changes, hint) {
function loadMode (line 4621) | function loadMode(cm) {
function resetModeState (line 4626) | function resetModeState(cm) {
function isWholeLineUpdate (line 4642) | function isWholeLineUpdate(doc, change) {
function updateDoc (line 4648) | function updateDoc(doc, change, markedSpans, estimateHeight$$1) {
function linkedDocs (line 4700) | function linkedDocs(doc, f, sharedHistOnly) {
function attachDoc (line 4715) | function attachDoc(cm, doc) {
function setDirectionClass (line 4727) | function setDirectionClass(cm) {
function directionChanged (line 4731) | function directionChanged(cm) {
function History (line 4738) | function History(startGen) {
function historyChangeFromChange (line 4755) | function historyChangeFromChange(doc, change) {
function clearSelectionEvents (line 4764) | function clearSelectionEvents(array) {
function lastChangeEvent (line 4774) | function lastChangeEvent(hist, force) {
function addChangeToHistory (line 4789) | function addChangeToHistory(doc, change, selAfter, opId) {
function selectionEventCanBeMerged (line 4832) | function selectionEventCanBeMerged(doc, origin, prev, sel) {
function addSelectionToHistory (line 4845) | function addSelectionToHistory(doc, sel, opId, options) {
function pushSelectionToHistory (line 4867) | function pushSelectionToHistory(sel, dest) {
function attachLocalSpans (line 4874) | function attachLocalSpans(doc, change, from, to) {
function removeClearedSpans (line 4885) | function removeClearedSpans(spans) {
function getOldSpans (line 4896) | function getOldSpans(doc, change) {
function mergeOldSpans (line 4909) | function mergeOldSpans(doc, change) {
function copyHistoryArray (line 4933) | function copyHistoryArray(events, newGroup, instantiateSel) {
function extendRange (line 4965) | function extendRange(range, head, other, extend) {
function extendSelection (line 4984) | function extendSelection(doc, head, other, options, extend) {
function extendSelections (line 4991) | function extendSelections(doc, heads, options) {
function replaceOneSelection (line 5001) | function replaceOneSelection(doc, i, range, options) {
function setSimpleSelection (line 5008) | function setSimpleSelection(doc, anchor, head, options) {
function filterSelectionChange (line 5014) | function filterSelectionChange(doc, sel, options) {
function setSelectionReplaceHistory (line 5033) | function setSelectionReplaceHistory(doc, sel, options) {
function setSelection (line 5044) | function setSelection(doc, sel, options) {
function setSelectionNoUndo (line 5049) | function setSelectionNoUndo(doc, sel, options) {
function setSelectionInner (line 5061) | function setSelectionInner(doc, sel) {
function reCheckSelection (line 5075) | function reCheckSelection(doc) {
function skipAtomicInSelection (line 5081) | function skipAtomicInSelection(doc, sel, bias, mayClear) {
function skipAtomicInner (line 5096) | function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {
function skipAtomic (line 5129) | function skipAtomic(doc, pos, oldPos, bias, mayClear) {
function movePos (line 5142) | function movePos(doc, pos, dir, line) {
function selectAll (line 5154) | function selectAll(cm) {
function filterChange (line 5161) | function filterChange(doc, change, update) {
function makeChange (line 5185) | function makeChange(doc, change, ignoreReadOnly) {
function makeChangeInner (line 5207) | function makeChangeInner(doc, change) {
function makeChangeFromHistory (line 5225) | function makeChangeFromHistory(doc, type, allowSelectionOnly) {
function shiftDoc (line 5298) | function shiftDoc(doc, distance) {
function makeChangeSingleDoc (line 5314) | function makeChangeSingleDoc(doc, change, selAfter, spans) {
function makeChangeSingleDocInEditor (line 5347) | function makeChangeSingleDocInEditor(cm, change, spans) {
function replaceRange (line 5405) | function replaceRange(doc, code, from, to, origin) {
function rebaseHistSelSingle (line 5415) | function rebaseHistSelSingle(pos, from, to, diff) {
function rebaseHistArray (line 5431) | function rebaseHistArray(array, from, to, diff) {
function rebaseHist (line 5459) | function rebaseHist(hist, change) {
function changeLine (line 5468) | function changeLine(doc, handle, changeType, op) {
function LeafChunk (line 5490) | function LeafChunk(lines) {
function BranchChunk (line 5543) | function BranchChunk(children) {
function adjustScrollWhenAboveVisible (line 5706) | function adjustScrollWhenAboveVisible(cm, line, diff) {
function addLineWidget (line 5711) | function addLineWidget(doc, handle, node, options) {
function markText (line 5870) | function markText(doc, from, to, options, type) {
function markTextShared (line 5968) | function markTextShared(doc, from, to, options, type) {
function findSharedMarkers (line 5983) | function findSharedMarkers(doc) {
function copySharedMarkers (line 5987) | function copySharedMarkers(doc, markers) {
function detachSharedMarkers (line 5999) | function detachSharedMarkers(markers) {
function onDrop (line 6441) | function onDrop(e) {
function onDragStart (line 6501) | function onDragStart(cm, e) {
function onDragOver (line 6524) | function onDragOver(cm, e) {
function clearDragCursor (line 6536) | function clearDragCursor(cm) {
function forEachCodeMirror (line 6547) | function forEachCodeMirror(f) {
function ensureGlobalHandlers (line 6557) | function ensureGlobalHandlers() {
function registerGlobalHandlers (line 6562) | function registerGlobalHandlers() {
function onResize (line 6575) | function onResize(cm) {
function normalizeKeyName (line 6648) | function normalizeKeyName(name) {
function normalizeKeyMap (line 6672) | function normalizeKeyMap(keymap) {
function lookupKey (line 6699) | function lookupKey(key, map$$1, handle, context) {
function isModifierKey (line 6718) | function isModifierKey(value) {
function addModifierNames (line 6723) | function addModifierNames(name, event, noShift) {
function keyName (line 6733) | function keyName(event, noShift) {
function getKeyMap (line 6740) | function getKeyMap(val) {
function deleteNearSelection (line 6746) | function deleteNearSelection(cm, compute) {
function moveCharLogically (line 6769) | function moveCharLogically(line, ch, dir) {
function moveLogically (line 6774) | function moveLogically(line, start, dir) {
function endOfLine (line 6779) | function endOfLine(visually, cm, lineObj, lineNo, dir) {
function moveVisually (line 6806) | function moveVisually(cm, line, start, dir) {
function lineStart (line 7018) | function lineStart(cm, lineN) {
function lineEnd (line 7024) | function lineEnd(cm, lineN) {
function lineStartSmart (line 7030) | function lineStartSmart(cm, pos) {
function doHandleBinding (line 7043) | function doHandleBinding(cm, bound, dropShift) {
function lookupKeyForEditor (line 7063) | function lookupKeyForEditor(cm, name, handle) {
function dispatchKey (line 7076) | function dispatchKey(cm, name, e, handle) {
function handleKeyBinding (line 7108) | function handleKeyBinding(cm, e) {
function handleCharBinding (line 7127) | function handleCharBinding(cm, e, ch) {
function onKeyDown (line 7132) | function onKeyDown(e) {
function showCrossHair (line 7153) | function showCrossHair(cm) {
function onKeyUp (line 7168) | function onKeyUp(e) {
function onKeyPress (line 7173) | function onKeyPress(e) {
function clickRepeat (line 7201) | function clickRepeat(pos, button) {
function onMouseDown (line 7222) | function onMouseDown(e) {
function handleMappedButton (line 7259) | function handleMappedButton(cm, button, pos, repeat, event) {
function configureMouse (line 7279) | function configureMouse(cm, repeat, event) {
function leftButtonDown (line 7292) | function leftButtonDown(cm, pos, repeat, event) {
function leftButtonStartDrag (line 7310) | function leftButtonStartDrag(cm, event, pos, behavior) {
function rangeForUnit (line 7349) | function rangeForUnit(cm, pos, unit) {
function leftButtonSelect (line 7358) | function leftButtonSelect(cm, event, start, behavior) {
function bidiSimplify (line 7490) | function bidiSimplify(cm, range$$1) {
function gutterEvent (line 7525) | function gutterEvent(cm, e, type, prevent) {
function clickInGutter (line 7554) | function clickInGutter(cm, e) {
function onContextMenu (line 7563) | function onContextMenu(cm, e) {
function contextMenuInGutter (line 7569) | function contextMenuInGutter(cm, e) {
function themeChanged (line 7574) | function themeChanged(cm) {
function defineOptions (line 7585) | function defineOptions(CodeMirror) {
function guttersChanged (line 7718) | function guttersChanged(cm) {
function dragDropChanged (line 7724) | function dragDropChanged(cm, value, old) {
function wrappingChanged (line 7737) | function wrappingChanged(cm) {
function CodeMirror$1 (line 7755) | function CodeMirror$1(place, options) {
function registerEventHandlers (line 7831) | function registerEventHandlers(cm) {
function indentLine (line 7946) | function indentLine(cm, n, how, aggressive) {
function setLastCopied (line 8010) | function setLastCopied(newLastCopied) {
function applyTextInput (line 8014) | function applyTextInput(cm, inserted, deleted, sel, origin) {
function handlePaste (line 8062) | function handlePaste(e, cm) {
function triggerElectric (line 8072) | function triggerElectric(cm, inserted) {
function copyableRanges (line 8096) | function copyableRanges(cm) {
function disableBrowserMagic (line 8107) | function disableBrowserMagic(field, spellcheck) {
function hiddenTextarea (line 8113) | function hiddenTextarea() {
function findPosH (line 8579) | function findPosH(doc, pos, dir, unit, visually) {
function findPosV (line 8639) | function findPosV(cm, pos, dir, unit) {
function onCopyCut (line 8702) | function onCopyCut(e) {
function poll (line 8856) | function poll() {
function posToDOM (line 9022) | function posToDOM(cm, pos) {
function isInGutter (line 9038) | function isInGutter(node) {
function badPos (line 9044) | function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }
function domTextBetween (line 9046) | function domTextBetween(cm, from, to, fromLine, toLine) {
function domToPos (line 9093) | function domToPos(cm, node, offset) {
function locateNodeInLineView (line 9112) | function locateNodeInLineView(lineView, node, offset) {
function prepareCopyCut (line 9212) | function prepareCopyCut(e) {
function p (line 9344) | function p() {
function prepareSelectAllHack (line 9447) | function prepareSelectAllHack() {
function rehide (line 9460) | function rehide() {
function fromTextArea (line 9506) | function fromTextArea(textarea, options) {
function addLegacyProps (line 9563) | function addLegacyProps(CodeMirror) {
FILE: doc/third_party/MathJax-2.7.2/config/AM_CHTML-full.js
function E (line 47) | function E(ac){if(l){return e.createElement(ac)}else{return e.createElem...
function P (line 47) | function P(ac){if(l){return e.createElement("m:"+ac)}else{return e.creat...
function O (line 47) | function O(ac,ae){var ad;if(l){ad=e.createElement("m:"+ac)}else{ad=e.cre...
function u (line 47) | function u(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function r (line 47) | function r(ac){z.push(ac);B()}
function T (line 47) | function T(ad,ac){if(ad.input>ac.input){return 1}else{return -1}}
function n (line 47) | function n(){var ad;var ac=z.length;for(ad=0;ad<ac;ad++){if(z[ad].tex){z...
function B (line 47) | function B(){var ac;z.sort(T);for(ac=0;ac<z.length;ac++){S[ac]=z[ac].inp...
function I (line 47) | function I(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function p (line 47) | function p(ae,af){var ac;if(ae.charAt(af)=="\\"&&ae.charAt(af+1)!="\\"&&...
function N (line 47) | function N(ad,ag,ah){if(ah==0){var af,ac;ah=-1;af=ad.length;while(ah+1<a...
function j (line 47) | function j(ai){var ac=0;var ad=0;var af;var al;var ak;var ag="";var ah=t...
function R (line 47) | function R(ad){var ac;if(!ad.hasChildNodes()){return}if(ad.firstChild.ha...
function G (line 47) | function G(ai){var ae,ad,al,ag,ak,ah=e.createDocumentFragment();ai=p(ai,...
function t (line 47) | function t(ai){var ag,aj,ah,af,ac,ae;ai=p(ai,0);aj=j(ai);ac=G(ai);af=ac[...
function q (line 47) | function q(ak,aj){var ao,al,ag,ar,ah=e.createDocumentFragment();do{ak=p(...
function M (line 47) | function M(ae,ad){var af,ac;F=0;ae=ae.replace(/ /g,"");ae=ae.replac...
FILE: doc/third_party/MathJax-2.7.2/config/AM_CHTML.js
function E (line 45) | function E(ac){if(l){return e.createElement(ac)}else{return e.createElem...
function P (line 45) | function P(ac){if(l){return e.createElement("m:"+ac)}else{return e.creat...
function O (line 45) | function O(ac,ae){var ad;if(l){ad=e.createElement("m:"+ac)}else{ad=e.cre...
function u (line 45) | function u(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function r (line 45) | function r(ac){z.push(ac);B()}
function T (line 45) | function T(ad,ac){if(ad.input>ac.input){return 1}else{return -1}}
function n (line 45) | function n(){var ad;var ac=z.length;for(ad=0;ad<ac;ad++){if(z[ad].tex){z...
function B (line 45) | function B(){var ac;z.sort(T);for(ac=0;ac<z.length;ac++){S[ac]=z[ac].inp...
function I (line 45) | function I(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function p (line 45) | function p(ae,af){var ac;if(ae.charAt(af)=="\\"&&ae.charAt(af+1)!="\\"&&...
function N (line 45) | function N(ad,ag,ah){if(ah==0){var af,ac;ah=-1;af=ad.length;while(ah+1<a...
function j (line 45) | function j(ai){var ac=0;var ad=0;var af;var al;var ak;var ag="";var ah=t...
function R (line 45) | function R(ad){var ac;if(!ad.hasChildNodes()){return}if(ad.firstChild.ha...
function G (line 45) | function G(ai){var ae,ad,al,ag,ak,ah=e.createDocumentFragment();ai=p(ai,...
function t (line 45) | function t(ai){var ag,aj,ah,af,ac,ae;ai=p(ai,0);aj=j(ai);ac=G(ai);af=ac[...
function q (line 45) | function q(ak,aj){var ao,al,ag,ar,ah=e.createDocumentFragment();do{ak=p(...
function M (line 45) | function M(ae,ad){var af,ac;F=0;ae=ae.replace(/ /g,"");ae=ae.replac...
FILE: doc/third_party/MathJax-2.7.2/config/AM_HTMLorMML-full.js
function E (line 54) | function E(ac){if(l){return e.createElement(ac)}else{return e.createElem...
function P (line 54) | function P(ac){if(l){return e.createElement("m:"+ac)}else{return e.creat...
function O (line 54) | function O(ac,ae){var ad;if(l){ad=e.createElement("m:"+ac)}else{ad=e.cre...
function u (line 54) | function u(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function r (line 54) | function r(ac){z.push(ac);B()}
function T (line 54) | function T(ad,ac){if(ad.input>ac.input){return 1}else{return -1}}
function n (line 54) | function n(){var ad;var ac=z.length;for(ad=0;ad<ac;ad++){if(z[ad].tex){z...
function B (line 54) | function B(){var ac;z.sort(T);for(ac=0;ac<z.length;ac++){S[ac]=z[ac].inp...
function I (line 54) | function I(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function p (line 54) | function p(ae,af){var ac;if(ae.charAt(af)=="\\"&&ae.charAt(af+1)!="\\"&&...
function N (line 54) | function N(ad,ag,ah){if(ah==0){var af,ac;ah=-1;af=ad.length;while(ah+1<a...
function j (line 54) | function j(ai){var ac=0;var ad=0;var af;var al;var ak;var ag="";var ah=t...
function R (line 54) | function R(ad){var ac;if(!ad.hasChildNodes()){return}if(ad.firstChild.ha...
function G (line 54) | function G(ai){var ae,ad,al,ag,ak,ah=e.createDocumentFragment();ai=p(ai,...
function t (line 54) | function t(ai){var ag,aj,ah,af,ac,ae;ai=p(ai,0);aj=j(ai);ac=G(ai);af=ac[...
function q (line 54) | function q(ak,aj){var ao,al,ag,ar,ah=e.createDocumentFragment();do{ak=p(...
function M (line 54) | function M(ae,ad){var af,ac;F=0;ae=ae.replace(/ /g,"");ae=ae.replac...
FILE: doc/third_party/MathJax-2.7.2/config/AM_HTMLorMML.js
function E (line 51) | function E(ac){if(l){return e.createElement(ac)}else{return e.createElem...
function P (line 51) | function P(ac){if(l){return e.createElement("m:"+ac)}else{return e.creat...
function O (line 51) | function O(ac,ae){var ad;if(l){ad=e.createElement("m:"+ac)}else{ad=e.cre...
function u (line 51) | function u(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function r (line 51) | function r(ac){z.push(ac);B()}
function T (line 51) | function T(ad,ac){if(ad.input>ac.input){return 1}else{return -1}}
function n (line 51) | function n(){var ad;var ac=z.length;for(ad=0;ad<ac;ad++){if(z[ad].tex){z...
function B (line 51) | function B(){var ac;z.sort(T);for(ac=0;ac<z.length;ac++){S[ac]=z[ac].inp...
function I (line 51) | function I(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function p (line 51) | function p(ae,af){var ac;if(ae.charAt(af)=="\\"&&ae.charAt(af+1)!="\\"&&...
function N (line 51) | function N(ad,ag,ah){if(ah==0){var af,ac;ah=-1;af=ad.length;while(ah+1<a...
function j (line 51) | function j(ai){var ac=0;var ad=0;var af;var al;var ak;var ag="";var ah=t...
function R (line 51) | function R(ad){var ac;if(!ad.hasChildNodes()){return}if(ad.firstChild.ha...
function G (line 51) | function G(ai){var ae,ad,al,ag,ak,ah=e.createDocumentFragment();ai=p(ai,...
function t (line 51) | function t(ai){var ag,aj,ah,af,ac,ae;ai=p(ai,0);aj=j(ai);ac=G(ai);af=ac[...
function q (line 51) | function q(ak,aj){var ao,al,ag,ar,ah=e.createDocumentFragment();do{ak=p(...
function M (line 51) | function M(ae,ad){var af,ac;F=0;ae=ae.replace(/ /g,"");ae=ae.replac...
FILE: doc/third_party/MathJax-2.7.2/config/AM_SVG-full.js
function E (line 47) | function E(ac){if(l){return e.createElement(ac)}else{return e.createElem...
function P (line 47) | function P(ac){if(l){return e.createElement("m:"+ac)}else{return e.creat...
function O (line 47) | function O(ac,ae){var ad;if(l){ad=e.createElement("m:"+ac)}else{ad=e.cre...
function u (line 47) | function u(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function r (line 47) | function r(ac){z.push(ac);B()}
function T (line 47) | function T(ad,ac){if(ad.input>ac.input){return 1}else{return -1}}
function n (line 47) | function n(){var ad;var ac=z.length;for(ad=0;ad<ac;ad++){if(z[ad].tex){z...
function B (line 47) | function B(){var ac;z.sort(T);for(ac=0;ac<z.length;ac++){S[ac]=z[ac].inp...
function I (line 47) | function I(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function p (line 47) | function p(ae,af){var ac;if(ae.charAt(af)=="\\"&&ae.charAt(af+1)!="\\"&&...
function N (line 47) | function N(ad,ag,ah){if(ah==0){var af,ac;ah=-1;af=ad.length;while(ah+1<a...
function j (line 47) | function j(ai){var ac=0;var ad=0;var af;var al;var ak;var ag="";var ah=t...
function R (line 47) | function R(ad){var ac;if(!ad.hasChildNodes()){return}if(ad.firstChild.ha...
function G (line 47) | function G(ai){var ae,ad,al,ag,ak,ah=e.createDocumentFragment();ai=p(ai,...
function t (line 47) | function t(ai){var ag,aj,ah,af,ac,ae;ai=p(ai,0);aj=j(ai);ac=G(ai);af=ac[...
function q (line 47) | function q(ak,aj){var ao,al,ag,ar,ah=e.createDocumentFragment();do{ak=p(...
function M (line 47) | function M(ae,ad){var af,ac;F=0;ae=ae.replace(/ /g,"");ae=ae.replac...
FILE: doc/third_party/MathJax-2.7.2/config/AM_SVG.js
function E (line 44) | function E(ac){if(l){return e.createElement(ac)}else{return e.createElem...
function P (line 44) | function P(ac){if(l){return e.createElement("m:"+ac)}else{return e.creat...
function O (line 44) | function O(ac,ae){var ad;if(l){ad=e.createElement("m:"+ac)}else{ad=e.cre...
function u (line 44) | function u(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function r (line 44) | function r(ac){z.push(ac);B()}
function T (line 44) | function T(ad,ac){if(ad.input>ac.input){return 1}else{return -1}}
function n (line 44) | function n(){var ad;var ac=z.length;for(ad=0;ad<ac;ad++){if(z[ad].tex){z...
function B (line 44) | function B(){var ac;z.sort(T);for(ac=0;ac<z.length;ac++){S[ac]=z[ac].inp...
function I (line 44) | function I(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function p (line 44) | function p(ae,af){var ac;if(ae.charAt(af)=="\\"&&ae.charAt(af+1)!="\\"&&...
function N (line 44) | function N(ad,ag,ah){if(ah==0){var af,ac;ah=-1;af=ad.length;while(ah+1<a...
function j (line 44) | function j(ai){var ac=0;var ad=0;var af;var al;var ak;var ag="";var ah=t...
function R (line 44) | function R(ad){var ac;if(!ad.hasChildNodes()){return}if(ad.firstChild.ha...
function G (line 44) | function G(ai){var ae,ad,al,ag,ak,ah=e.createDocumentFragment();ai=p(ai,...
function t (line 44) | function t(ai){var ag,aj,ah,af,ac,ae;ai=p(ai,0);aj=j(ai);ac=G(ai);af=ac[...
function q (line 44) | function q(ak,aj){var ao,al,ag,ar,ah=e.createDocumentFragment();do{ak=p(...
function M (line 44) | function M(ae,ad){var af,ac;F=0;ae=ae.replace(/ /g,"");ae=ae.replac...
FILE: doc/third_party/MathJax-2.7.2/config/TeX-MML-AM_CHTML-full.js
function E (line 67) | function E(ac){if(l){return e.createElement(ac)}else{return e.createElem...
function P (line 67) | function P(ac){if(l){return e.createElement("m:"+ac)}else{return e.creat...
function O (line 67) | function O(ac,ae){var ad;if(l){ad=e.createElement("m:"+ac)}else{ad=e.cre...
function u (line 67) | function u(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function r (line 67) | function r(ac){z.push(ac);B()}
function T (line 67) | function T(ad,ac){if(ad.input>ac.input){return 1}else{return -1}}
function n (line 67) | function n(){var ad;var ac=z.length;for(ad=0;ad<ac;ad++){if(z[ad].tex){z...
function B (line 67) | function B(){var ac;z.sort(T);for(ac=0;ac<z.length;ac++){S[ac]=z[ac].inp...
function I (line 67) | function I(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function p (line 67) | function p(ae,af){var ac;if(ae.charAt(af)=="\\"&&ae.charAt(af+1)!="\\"&&...
function N (line 67) | function N(ad,ag,ah){if(ah==0){var af,ac;ah=-1;af=ad.length;while(ah+1<a...
function j (line 67) | function j(ai){var ac=0;var ad=0;var af;var al;var ak;var ag="";var ah=t...
function R (line 67) | function R(ad){var ac;if(!ad.hasChildNodes()){return}if(ad.firstChild.ha...
function G (line 67) | function G(ai){var ae,ad,al,ag,ak,ah=e.createDocumentFragment();ai=p(ai,...
function t (line 67) | function t(ai){var ag,aj,ah,af,ac,ae;ai=p(ai,0);aj=j(ai);ac=G(ai);af=ac[...
function q (line 67) | function q(ak,aj){var ao,al,ag,ar,ah=e.createDocumentFragment();do{ak=p(...
function M (line 67) | function M(ae,ad){var af,ac;F=0;ae=ae.replace(/ /g,"");ae=ae.replac...
FILE: doc/third_party/MathJax-2.7.2/config/TeX-MML-AM_CHTML.js
function E (line 65) | function E(ac){if(l){return e.createElement(ac)}else{return e.createElem...
function P (line 65) | function P(ac){if(l){return e.createElement("m:"+ac)}else{return e.creat...
function O (line 65) | function O(ac,ae){var ad;if(l){ad=e.createElement("m:"+ac)}else{ad=e.cre...
function u (line 65) | function u(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function r (line 65) | function r(ac){z.push(ac);B()}
function T (line 65) | function T(ad,ac){if(ad.input>ac.input){return 1}else{return -1}}
function n (line 65) | function n(){var ad;var ac=z.length;for(ad=0;ad<ac;ad++){if(z[ad].tex){z...
function B (line 65) | function B(){var ac;z.sort(T);for(ac=0;ac<z.length;ac++){S[ac]=z[ac].inp...
function I (line 65) | function I(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function p (line 65) | function p(ae,af){var ac;if(ae.charAt(af)=="\\"&&ae.charAt(af+1)!="\\"&&...
function N (line 65) | function N(ad,ag,ah){if(ah==0){var af,ac;ah=-1;af=ad.length;while(ah+1<a...
function j (line 65) | function j(ai){var ac=0;var ad=0;var af;var al;var ak;var ag="";var ah=t...
function R (line 65) | function R(ad){var ac;if(!ad.hasChildNodes()){return}if(ad.firstChild.ha...
function G (line 65) | function G(ai){var ae,ad,al,ag,ak,ah=e.createDocumentFragment();ai=p(ai,...
function t (line 65) | function t(ai){var ag,aj,ah,af,ac,ae;ai=p(ai,0);aj=j(ai);ac=G(ai);af=ac[...
function q (line 65) | function q(ak,aj){var ao,al,ag,ar,ah=e.createDocumentFragment();do{ak=p(...
function M (line 65) | function M(ae,ad){var af,ac;F=0;ae=ae.replace(/ /g,"");ae=ae.replac...
FILE: doc/third_party/MathJax-2.7.2/config/TeX-MML-AM_HTMLorMML-full.js
function E (line 74) | function E(ac){if(l){return e.createElement(ac)}else{return e.createElem...
function P (line 74) | function P(ac){if(l){return e.createElement("m:"+ac)}else{return e.creat...
function O (line 74) | function O(ac,ae){var ad;if(l){ad=e.createElement("m:"+ac)}else{ad=e.cre...
function u (line 74) | function u(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function r (line 74) | function r(ac){z.push(ac);B()}
function T (line 74) | function T(ad,ac){if(ad.input>ac.input){return 1}else{return -1}}
function n (line 74) | function n(){var ad;var ac=z.length;for(ad=0;ad<ac;ad++){if(z[ad].tex){z...
function B (line 74) | function B(){var ac;z.sort(T);for(ac=0;ac<z.length;ac++){S[ac]=z[ac].inp...
function I (line 74) | function I(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function p (line 74) | function p(ae,af){var ac;if(ae.charAt(af)=="\\"&&ae.charAt(af+1)!="\\"&&...
function N (line 74) | function N(ad,ag,ah){if(ah==0){var af,ac;ah=-1;af=ad.length;while(ah+1<a...
function j (line 74) | function j(ai){var ac=0;var ad=0;var af;var al;var ak;var ag="";var ah=t...
function R (line 74) | function R(ad){var ac;if(!ad.hasChildNodes()){return}if(ad.firstChild.ha...
function G (line 74) | function G(ai){var ae,ad,al,ag,ak,ah=e.createDocumentFragment();ai=p(ai,...
function t (line 74) | function t(ai){var ag,aj,ah,af,ac,ae;ai=p(ai,0);aj=j(ai);ac=G(ai);af=ac[...
function q (line 74) | function q(ak,aj){var ao,al,ag,ar,ah=e.createDocumentFragment();do{ak=p(...
function M (line 74) | function M(ae,ad){var af,ac;F=0;ae=ae.replace(/ /g,"");ae=ae.replac...
FILE: doc/third_party/MathJax-2.7.2/config/TeX-MML-AM_HTMLorMML.js
function E (line 71) | function E(ac){if(l){return e.createElement(ac)}else{return e.createElem...
function P (line 71) | function P(ac){if(l){return e.createElement("m:"+ac)}else{return e.creat...
function O (line 71) | function O(ac,ae){var ad;if(l){ad=e.createElement("m:"+ac)}else{ad=e.cre...
function u (line 71) | function u(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function r (line 71) | function r(ac){z.push(ac);B()}
function T (line 71) | function T(ad,ac){if(ad.input>ac.input){return 1}else{return -1}}
function n (line 71) | function n(){var ad;var ac=z.length;for(ad=0;ad<ac;ad++){if(z[ad].tex){z...
function B (line 71) | function B(){var ac;z.sort(T);for(ac=0;ac<z.length;ac++){S[ac]=z[ac].inp...
function I (line 71) | function I(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function p (line 71) | function p(ae,af){var ac;if(ae.charAt(af)=="\\"&&ae.charAt(af+1)!="\\"&&...
function N (line 71) | function N(ad,ag,ah){if(ah==0){var af,ac;ah=-1;af=ad.length;while(ah+1<a...
function j (line 71) | function j(ai){var ac=0;var ad=0;var af;var al;var ak;var ag="";var ah=t...
function R (line 71) | function R(ad){var ac;if(!ad.hasChildNodes()){return}if(ad.firstChild.ha...
function G (line 71) | function G(ai){var ae,ad,al,ag,ak,ah=e.createDocumentFragment();ai=p(ai,...
function t (line 71) | function t(ai){var ag,aj,ah,af,ac,ae;ai=p(ai,0);aj=j(ai);ac=G(ai);af=ac[...
function q (line 71) | function q(ak,aj){var ao,al,ag,ar,ah=e.createDocumentFragment();do{ak=p(...
function M (line 71) | function M(ae,ad){var af,ac;F=0;ae=ae.replace(/ /g,"");ae=ae.replac...
FILE: doc/third_party/MathJax-2.7.2/config/TeX-MML-AM_SVG-full.js
function E (line 67) | function E(ac){if(l){return e.createElement(ac)}else{return e.createElem...
function P (line 67) | function P(ac){if(l){return e.createElement("m:"+ac)}else{return e.creat...
function O (line 67) | function O(ac,ae){var ad;if(l){ad=e.createElement("m:"+ac)}else{ad=e.cre...
function u (line 67) | function u(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function r (line 67) | function r(ac){z.push(ac);B()}
function T (line 67) | function T(ad,ac){if(ad.input>ac.input){return 1}else{return -1}}
function n (line 67) | function n(){var ad;var ac=z.length;for(ad=0;ad<ac;ad++){if(z[ad].tex){z...
function B (line 67) | function B(){var ac;z.sort(T);for(ac=0;ac<z.length;ac++){S[ac]=z[ac].inp...
function I (line 67) | function I(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function p (line 67) | function p(ae,af){var ac;if(ae.charAt(af)=="\\"&&ae.charAt(af+1)!="\\"&&...
function N (line 67) | function N(ad,ag,ah){if(ah==0){var af,ac;ah=-1;af=ad.length;while(ah+1<a...
function j (line 67) | function j(ai){var ac=0;var ad=0;var af;var al;var ak;var ag="";var ah=t...
function R (line 67) | function R(ad){var ac;if(!ad.hasChildNodes()){return}if(ad.firstChild.ha...
function G (line 67) | function G(ai){var ae,ad,al,ag,ak,ah=e.createDocumentFragment();ai=p(ai,...
function t (line 67) | function t(ai){var ag,aj,ah,af,ac,ae;ai=p(ai,0);aj=j(ai);ac=G(ai);af=ac[...
function q (line 67) | function q(ak,aj){var ao,al,ag,ar,ah=e.createDocumentFragment();do{ak=p(...
function M (line 67) | function M(ae,ad){var af,ac;F=0;ae=ae.replace(/ /g,"");ae=ae.replac...
FILE: doc/third_party/MathJax-2.7.2/config/TeX-MML-AM_SVG.js
function E (line 65) | function E(ac){if(l){return e.createElement(ac)}else{return e.createElem...
function P (line 65) | function P(ac){if(l){return e.createElement("m:"+ac)}else{return e.creat...
function O (line 65) | function O(ac,ae){var ad;if(l){ad=e.createElement("m:"+ac)}else{ad=e.cre...
function u (line 65) | function u(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function r (line 65) | function r(ac){z.push(ac);B()}
function T (line 65) | function T(ad,ac){if(ad.input>ac.input){return 1}else{return -1}}
function n (line 65) | function n(){var ad;var ac=z.length;for(ad=0;ad<ac;ad++){if(z[ad].tex){z...
function B (line 65) | function B(){var ac;z.sort(T);for(ac=0;ac<z.length;ac++){S[ac]=z[ac].inp...
function I (line 65) | function I(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function p (line 65) | function p(ae,af){var ac;if(ae.charAt(af)=="\\"&&ae.charAt(af+1)!="\\"&&...
function N (line 65) | function N(ad,ag,ah){if(ah==0){var af,ac;ah=-1;af=ad.length;while(ah+1<a...
function j (line 65) | function j(ai){var ac=0;var ad=0;var af;var al;var ak;var ag="";var ah=t...
function R (line 65) | function R(ad){var ac;if(!ad.hasChildNodes()){return}if(ad.firstChild.ha...
function G (line 65) | function G(ai){var ae,ad,al,ag,ak,ah=e.createDocumentFragment();ai=p(ai,...
function t (line 65) | function t(ai){var ag,aj,ah,af,ac,ae;ai=p(ai,0);aj=j(ai);ac=G(ai);af=ac[...
function q (line 65) | function q(ak,aj){var ao,al,ag,ar,ah=e.createDocumentFragment();do{ak=p(...
function M (line 65) | function M(ae,ad){var af,ac;F=0;ae=ae.replace(/ /g,"");ae=ae.replac...
FILE: doc/third_party/MathJax-2.7.2/extensions/MathML/content-mathml.js
function u (line 19) | function u(O,l){a.appendToken(M,"mo","\u2202");var j=h[O];if(l>1){var i=...
FILE: doc/third_party/MathJax-2.7.2/extensions/a11y/mathjax-sre.js
function b (line 27) | function b(a){if(!(a in e.written||a in e.visited)){e.visited[a]=!0;if(a...
function c (line 47) | function c(){}
function a (line 53) | function a(a,b){d?c[a]=!0:b()?c[a]=!1:d=c[a]=!0}
function b (line 53) | function b(a){try{return!!eval(a)}catch(g){return!1}}
FILE: doc/third_party/MathJax-2.7.2/extensions/a11y/wgxpath.install.js
function aa (line 2) | function aa(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array...
function l (line 3) | function l(a){return"string"==typeof a}
function ba (line 3) | function ba(a,b,c){return a.call.apply(a.bind,arguments)}
function ca (line 3) | function ca(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Arra...
function da (line 4) | function da(a,b,c){da=Function.prototype.bind&&-1!=Function.prototype.bi...
function ea (line 4) | function ea(a,b){var c=Array.prototype.slice.call(arguments,1);return fu...
function m (line 5) | function m(a){var b=n;function c(){}c.prototype=b.prototype;a.G=b.protot...
function q (line 30) | function q(a,b){return-1!=a.indexOf(b)}
function ga (line 30) | function ga(a,b){return a<b?-1:a>b?1:0}
function ka (line 32) | function ka(a,b){var c;a:{c=a.length;for(var d=l(a)?a.split(""):a,e=0;e<...
function la (line 32) | function la(a){return Array.prototype.concat.apply(Array.prototype,argum...
function ma (line 32) | function ma(a,b,c){return 2>=arguments.length?Array.prototype.slice.call...
function ta (line 32) | function ta(){var a=k.document;return a?a.documentMode:void 0}
function za (line 34) | function za(a){if(!ya[a]){for(var b=0,c=fa(String(ua)).split("."),d=fa(S...
function x (line 35) | function x(a,b,c,d){this.a=a;this.nodeName=c;this.nodeValue=d;this.nodeT...
function Da (line 35) | function Da(a,b){var c=Ca&&"href"==b.nodeName?a.getAttribute(b.nodeName,...
function z (line 35) | function z(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void 0==b...
function A (line 36) | function A(a,b,c){if(null===b)return!0;try{if(!a.getAttribute)return!1}c...
function B (line 36) | function B(a,b,c,d,e){return(w?Ea:Fa).call(null,a,b,l(c)?c:null,l(d)?d:n...
function Ea (line 37) | function Ea(a,b,c,d,e){if(a instanceof E||8==a.b||c&&null===a.b){var f=b...
function Fa (line 38) | function Fa(a,b,c,d,e){b.getElementsByName&&d&&"name"==c&&!v?(b=b.getEle...
function Ia (line 39) | function Ia(a,b,c,d,e){var f;if((a instanceof E||8==a.b||c&&null===a.b)&...
function Ja (line 39) | function Ja(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)A(b,c,d)&&a....
function Ha (line 40) | function Ha(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)A(b,c,d)&&a....
function Ga (line 40) | function Ga(a){if(a instanceof G){if(8==a.b)return"!";if(null===a.b)retu...
function Ka (line 40) | function Ka(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return ...
function La (line 41) | function La(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a....
function Na (line 42) | function Na(a,b){var c=a.parentNode;if(c==b)return-1;for(var d=b;d.paren...
function Ma (line 42) | function Ma(a,b){for(var c=b;c=c.previousSibling;)if(c==a)return-1;retur...
function C (line 42) | function C(){this.b=this.a=null;this.l=0}
function Oa (line 42) | function Oa(a){this.node=a;this.a=this.b=null}
function Pa (line 42) | function Pa(a,b){if(!a.a)return b;if(!b.a)return a;for(var c=a.a,d=b.a,e...
function Qa (line 42) | function Qa(a,b){var c=new Oa(b);c.a=a.a;a.b?a.a.b=c:a.a=a.b=c;a.a=c;a.l++}
function F (line 43) | function F(a,b){var c=new Oa(b);c.b=a.b;a.a?a.b.a=c:a.a=a.b=c;a.b=c;a.l++}
function Ra (line 43) | function Ra(a){return(a=a.a)?a.node:null}
function Sa (line 43) | function Sa(a){return(a=Ra(a))?z(a):""}
function H (line 43) | function H(a,b){return new Ta(a,!!b)}
function Ta (line 43) | function Ta(a,b){this.f=a;this.b=(this.c=b)?a.b:a.a;this.a=null}
function I (line 43) | function I(a){var b=a.b;if(null==b)return null;var c=a.a=b;a.b=a.c?b.b:b...
function n (line 43) | function n(a){this.i=a;this.b=this.g=!1;this.f=null}
function J (line 43) | function J(a){return"\n "+a.toString().split("\n").join("\n ")}
function Ua (line 43) | function Ua(a,b){a.g=b}
function Va (line 43) | function Va(a,b){a.b=b}
function K (line 43) | function K(a,b){var c=a.a(b);return c instanceof C?+Sa(c):+c}
function L (line 43) | function L(a,b){var c=a.a(b);return c instanceof C?Sa(c):""+c}
function M (line 43) | function M(a,b){var c=a.a(b);return c instanceof C?!!c.l:!!c}
function N (line 43) | function N(a,b,c){n.call(this,a.i);this.c=a;this.h=b;this.o=c;this.g=b.g...
function O (line 44) | function O(a,b,c,d,e){b=b.a(d);c=c.a(d);var f;if(b instanceof C&&c insta...
function Xa (line 45) | function Xa(a,b,c,d){this.a=a;this.w=b;this.i=c;this.m=d}
function P (line 46) | function P(a,b,c,d){if(Ya.hasOwnProperty(a))throw Error("Binary operator...
function Q (line 47) | function Q(a,b,c){this.a=a;this.b=b||1;this.f=c||1}
function Za (line 47) | function Za(a,b){if(b.a.length&&4!=a.i)throw Error("Primary expression m...
function ab (line 47) | function ab(a,b){if(b.length<a.A)throw Error("Function "+a.j+" expects a...
function bb (line 48) | function bb(a,b,c,d,e,f,g,h,p){this.j=a;this.i=b;this.g=c;this.D=d;this....
function R (line 49) | function R(a,b,c,d,e,f,g,h){if(cb.hasOwnProperty(a))throw Error("Functio...
function c (line 50) | function c(a){if(w){var b=e.all[a];if(b){if(b.nodeType&&a==b.id)return b...
function G (line 54) | function G(a,b){this.h=a;this.c=void 0!==b?b:null;this.b=null;switch(a){...
function db (line 54) | function db(a){return"comment"==a||"text"==a||"processing-instruction"==...
function eb (line 55) | function eb(a){this.b=a;this.a=0}
function fb (line 55) | function fb(a){a=a.match(gb);for(var b=0;b<a.length;b++)hb.test(a[b])&&a...
function S (line 55) | function S(a,b){return a.b[a.a+(b||0)]}
function T (line 55) | function T(a){return a.b[a.a++]}
function ib (line 55) | function ib(a){return a.b.length<=a.a}
function jb (line 55) | function jb(a){n.call(this,3);this.c=a.substring(1,a.length-1)}
function E (line 55) | function E(a,b){this.j=a.toLowerCase();var c;c="*"==this.j?"*":"http://w...
function kb (line 56) | function kb(a,b){n.call(this,a.i);this.h=a;this.c=b;this.g=a.g;this.b=a....
function mb (line 56) | function mb(){n.call(this,4)}
function nb (line 56) | function nb(){n.call(this,4)}
function ob (line 57) | function ob(a){return"/"==a||"//"==a}
function rb (line 58) | function rb(a){n.call(this,4);this.c=a;Ua(this,ja(this.c,function(a){ret...
function sb (line 58) | function sb(a,b){this.a=a;this.b=!!b}
function $a (line 59) | function $a(a,b,c){for(c=c||0;c<a.a.length;c++)for(var d=a.a[c],e=H(b),f...
function U (line 60) | function U(a,b,c,d){n.call(this,4);this.c=a;this.o=b;this.h=c||new sb([]...
function vb (line 62) | function vb(a,b,c,d){this.j=a;this.f=b;this.a=c;this.b=d}
function V (line 62) | function V(a,b,c,d){if(wb.hasOwnProperty(a))throw Error("Axis already cr...
function zb (line 67) | function zb(a){n.call(this,1);this.c=a;this.g=a.g;this.b=a.b}
function Ab (line 67) | function Ab(a){n.call(this,1);this.c=a}
function Bb (line 67) | function Bb(a,b){this.a=a;this.b=b}
function Cb (line 67) | function Cb(a){for(var b,c=[];;){W(a,"Missing right hand side of binary ...
function W (line 67) | function W(a,b){if(ib(a.a))throw Error(b);}
function Eb (line 67) | function Eb(a,b){var c=T(a.a);if(c!=b)throw Error("Bad token, expected: ...
function Fb (line 68) | function Fb(a){a=T(a.a);if(")"!=a)throw Error("Bad token: "+a);}
function Gb (line 68) | function Gb(a){a=T(a.a);if(2>a.length)throw Error("Unclosed literal stri...
function Hb (line 69) | function Hb(a){var b,c=[],d;if(ob(S(a.a))){b=T(a.a);d=S(a.a);if("/"==b&&...
function Ib (line 71) | function Ib(a,b){var c,d,e;if("/"!=b&&"//"!=b)throw Error('Step op shoul...
function Jb (line 73) | function Jb(a){for(var b=[];"["==S(a.a);){T(a.a);W(a,"Missing predicate ...
function Db (line 73) | function Db(a){if("-"==S(a.a))return T(a.a),new zb(Db(a));var b=Hb(a);if...
function Kb (line 73) | function Kb(a){switch(a.nodeType){case 1:return ea(Lb,a);case 9:return K...
function Mb (line 73) | function Mb(){return null}
function Lb (line 73) | function Lb(a,b){if(a.prefix==b)return a.namespaceURI||"http://www.w3.or...
function Nb (line 73) | function Nb(a,b){if(!a.length)throw Error("Empty XPath expression.");var...
function Y (line 74) | function Y(a,b){if(0==b)if(a instanceof C)b=4;else if("string"==typeof a...
function Ob (line 76) | function Ob(a){this.lookupNamespaceURI=Kb(a)}
function Pb (line 77) | function Pb(a,b){var c=a||k,d=c.Document&&c.Document.prototype||c.docume...
FILE: doc/third_party/MathJax-2.7.2/jax/input/AsciiMath/jax.js
function E (line 19) | function E(ac){if(l){return e.createElement(ac)}else{return e.createElem...
function P (line 19) | function P(ac){if(l){return e.createElement("m:"+ac)}else{return e.creat...
function O (line 19) | function O(ac,ae){var ad;if(l){ad=e.createElement("m:"+ac)}else{ad=e.cre...
function u (line 19) | function u(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function r (line 19) | function r(ac){z.push(ac);B()}
function T (line 19) | function T(ad,ac){if(ad.input>ac.input){return 1}else{return -1}}
function n (line 19) | function n(){var ad;var ac=z.length;for(ad=0;ad<ac;ad++){if(z[ad].tex){z...
function B (line 19) | function B(){var ac;z.sort(T);for(ac=0;ac<z.length;ac++){S[ac]=z[ac].inp...
function I (line 19) | function I(ac,ad){z.push({input:ac,tag:"mo",output:ad,tex:null,ttype:V})...
function p (line 19) | function p(ae,af){var ac;if(ae.charAt(af)=="\\"&&ae.charAt(af+1)!="\\"&&...
function N (line 19) | function N(ad,ag,ah){if(ah==0){var af,ac;ah=-1;af=ad.length;while(ah+1<a...
function j (line 19) | function j(ai){var ac=0;var ad=0;var af;var al;var ak;var ag="";var ah=t...
function R (line 19) | function R(ad){var ac;if(!ad.hasChildNodes()){return}if(ad.firstChild.ha...
function G (line 19) | function G(ai){var ae,ad,al,ag,ak,ah=e.createDocumentFragment();ai=p(ai,...
function t (line 19) | function t(ai){var ag,aj,ah,af,ac,ae;ai=p(ai,0);aj=j(ai);ac=G(ai);af=ac[...
function q (line 19) | function q(ak,aj){var ao,al,ag,ar,ah=e.createDocumentFragment();do{ak=p(...
function M (line 19) | function M(ae,ad){var af,ac;F=0;ae=ae.replace(/ /g,"");ae=ae.replac...
FILE: doc/third_party/MathJax-2.7.2/latest.js
function g (line 19) | function g(q){if(console&&console.log){console.log(q)}}
function e (line 19) | function e(){if(document.currentScript){return document.currentScript}va...
function a (line 19) | function a(r){if(!r){return}var q=r.src.replace(/https:\/\//,"").replace...
function d (line 19) | function d(){var q;try{q=l.exec(document.cookie)}catch(r){}if(q&&q[1]!==...
function c (line 19) | function c(q){cookie="mjx.latest="+q;var s=new Date();s.setDate(s.getDat...
function j (line 19) | function j(){if(window.XMLHttpRequest){return new XMLHttpRequest()}if(wi...
function o (line 19) | function o(r){var q=document.createElement("script");q.type="text/javasc...
function i (line 19) | function i(){var q=e();if(q){o(q.src.replace(/\/latest\.js/,"/MathJax.js...
function m (line 19) | function m(q,r,s){var t=j();if(t){t.onreadystatechange=function(){if(t.r...
FILE: doc/third_party/MathJax-2.7.2/unpacked/extensions/MathML/content-mathml.js
function addDiff (line 1600) | function addDiff(n,degree) {
FILE: doc/third_party/MathJax-2.7.2/unpacked/extensions/a11y/mathjax-sre.js
function b (line 27) | function b(a){if(!(a in e.written||a in e.visited)){e.visited[a]=!0;if(a...
function c (line 47) | function c(){}
function a (line 53) | function a(a,b){d?c[a]=!0:b()?c[a]=!1:d=c[a]=!0}
function b (line 53) | function b(a){try{return!!eval(a)}catch(g){return!1}}
FILE: doc/third_party/MathJax-2.7.2/unpacked/extensions/a11y/wgxpath.install.js
function aa (line 2) | function aa(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array...
function l (line 3) | function l(a){return"string"==typeof a}
function ba (line 3) | function ba(a,b,c){return a.call.apply(a.bind,arguments)}
function ca (line 3) | function ca(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Arra...
function da (line 4) | function da(a,b,c){da=Function.prototype.bind&&-1!=Function.prototype.bi...
function ea (line 4) | function ea(a,b){var c=Array.prototype.slice.call(arguments,1);return fu...
function m (line 5) | function m(a){var b=n;function c(){}c.prototype=b.prototype;a.G=b.protot...
function q (line 30) | function q(a,b){return-1!=a.indexOf(b)}
function ga (line 30) | function ga(a,b){return a<b?-1:a>b?1:0}
function ka (line 32) | function ka(a,b){var c;a:{c=a.length;for(var d=l(a)?a.split(""):a,e=0;e<...
function la (line 32) | function la(a){return Array.prototype.concat.apply(Array.prototype,argum...
function ma (line 32) | function ma(a,b,c){return 2>=arguments.length?Array.prototype.slice.call...
function ta (line 32) | function ta(){var a=k.document;return a?a.documentMode:void 0}
function za (line 34) | function za(a){if(!ya[a]){for(var b=0,c=fa(String(ua)).split("."),d=fa(S...
function x (line 35) | function x(a,b,c,d){this.a=a;this.nodeName=c;this.nodeValue=d;this.nodeT...
function Da (line 35) | function Da(a,b){var c=Ca&&"href"==b.nodeName?a.getAttribute(b.nodeName,...
function z (line 35) | function z(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void 0==b...
function A (line 36) | function A(a,b,c){if(null===b)return!0;try{if(!a.getAttribute)return!1}c...
function B (line 36) | function B(a,b,c,d,e){return(w?Ea:Fa).call(null,a,b,l(c)?c:null,l(d)?d:n...
function Ea (line 37) | function Ea(a,b,c,d,e){if(a instanceof E||8==a.b||c&&null===a.b){var f=b...
function Fa (line 38) | function Fa(a,b,c,d,e){b.getElementsByName&&d&&"name"==c&&!v?(b=b.getEle...
function Ia (line 39) | function Ia(a,b,c,d,e){var f;if((a instanceof E||8==a.b||c&&null===a.b)&...
function Ja (line 39) | function Ja(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)A(b,c,d)&&a....
function Ha (line 40) | function Ha(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)A(b,c,d)&&a....
function Ga (line 40) | function Ga(a){if(a instanceof G){if(8==a.b)return"!";if(null===a.b)retu...
function Ka (line 40) | function Ka(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return ...
function La (line 41) | function La(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a....
function Na (line 42) | function Na(a,b){var c=a.parentNode;if(c==b)return-1;for(var d=b;d.paren...
function Ma (line 42) | function Ma(a,b){for(var c=b;c=c.previousSibling;)if(c==a)return-1;retur...
function C (line 42) | function C(){this.b=this.a=null;this.l=0}
function Oa (line 42) | function Oa(a){this.node=a;this.a=this.b=null}
function Pa (line 42) | function Pa(a,b){if(!a.a)return b;if(!b.a)return a;for(var c=a.a,d=b.a,e...
function Qa (line 42) | function Qa(a,b){var c=new Oa(b);c.a=a.a;a.b?a.a.b=c:a.a=a.b=c;a.a=c;a.l++}
function F (line 43) | function F(a,b){var c=new Oa(b);c.b=a.b;a.a?a.b.a=c:a.a=a.b=c;a.b=c;a.l++}
function Ra (line 43) | function Ra(a){return(a=a.a)?a.node:null}
function Sa (line 43) | function Sa(a){return(a=Ra(a))?z(a):""}
function H (line 43) | function H(a,b){return new Ta(a,!!b)}
function Ta (line 43) | function Ta(a,b){this.f=a;this.b=(this.c=b)?a.b:a.a;this.a=null}
function I (line 43) | function I(a){var b=a.b;if(null==b)return null;var c=a.a=b;a.b=a.c?b.b:b...
function n (line 43) | function n(a){this.i=a;this.b=this.g=!1;this.f=null}
function J (line 43) | function J(a){return"\n "+a.toString().split("\n").join("\n ")}
function Ua (line 43) | function Ua(a,b){a.g=b}
function Va (line 43) | function Va(a,b){a.b=b}
function K (line 43) | function K(a,b){var c=a.a(b);return c instanceof C?+Sa(c):+c}
function L (line 43) | function L(a,b){var c=a.a(b);return c instanceof C?Sa(c):""+c}
function M (line 43) | function M(a,b){var c=a.a(b);return c instanceof C?!!c.l:!!c}
function N (line 43) | function N(a,b,c){n.call(this,a.i);this.c=a;this.h=b;this.o=c;this.g=b.g...
function O (line 44) | function O(a,b,c,d,e){b=b.a(d);c=c.a(d);var f;if(b instanceof C&&c insta...
function Xa (line 45) | function Xa(a,b,c,d){this.a=a;this.w=b;this.i=c;this.m=d}
function P (line 46) | function P(a,b,c,d){if(Ya.hasOwnProperty(a))throw Error("Binary operator...
function Q (line 47) | function Q(a,b,c){this.a=a;this.b=b||1;this.f=c||1}
function Za (line 47) | function Za(a,b){if(b.a.length&&4!=a.i)throw Error("Primary expression m...
function ab (line 47) | function ab(a,b){if(b.length<a.A)throw Error("Function "+a.j+" expects a...
function bb (line 48) | function bb(a,b,c,d,e,f,g,h,p){this.j=a;this.i=b;this.g=c;this.D=d;this....
function R (line 49) | function R(a,b,c,d,e,f,g,h){if(cb.hasOwnProperty(a))throw Error("Functio...
function c (line 50) | function c(a){if(w){var b=e.all[a];if(b){if(b.nodeType&&a==b.id)return b...
function G (line 54) | function G(a,b){this.h=a;this.c=void 0!==b?b:null;this.b=null;switch(a){...
function db (line 54) | function db(a){return"comment"==a||"text"==a||"processing-instruction"==...
function eb (line 55) | function eb(a){this.b=a;this.a=0}
function fb (line 55) | function fb(a){a=a.match(gb);for(var b=0;b<a.length;b++)hb.test(a[b])&&a...
function S (line 55) | function S(a,b){return a.b[a.a+(b||0)]}
function T (line 55) | function T(a){return a.b[a.a++]}
function ib (line 55) | function ib(a){return a.b.length<=a.a}
function jb (line 55) | function jb(a){n.call(this,3);this.c=a.substring(1,a.length-1)}
function E (line 55) | function E(a,b){this.j=a.toLowerCase();var c;c="*"==this.j?"*":"http://w...
function kb (line 56) | function kb(a,b){n.call(this,a.i);this.h=a;this.c=b;this.g=a.g;this.b=a....
function mb (line 56) | function mb(){n.call(this,4)}
function nb (line 56) | function nb(){n.call(this,4)}
function ob (line 57) | function ob(a){return"/"==a||"//"==a}
function rb (line 58) | function rb(a){n.call(this,4);this.c=a;Ua(this,ja(this.c,function(a){ret...
function sb (line 58) | function sb(a,b){this.a=a;this.b=!!b}
function $a (line 59) | function $a(a,b,c){for(c=c||0;c<a.a.length;c++)for(var d=a.a[c],e=H(b),f...
function U (line 60) | function U(a,b,c,d){n.call(this,4);this.c=a;this.o=b;this.h=c||new sb([]...
function vb (line 62) | function vb(a,b,c,d){this.j=a;this.f=b;this.a=c;this.b=d}
function V (line 62) | function V(a,b,c,d){if(wb.hasOwnProperty(a))throw Error("Axis already cr...
function zb (line 67) | function zb(a){n.call(this,1);this.c=a;this.g=a.g;this.b=a.b}
function Ab (line 67) | function Ab(a){n.call(this,1);this.c=a}
function Bb (line 67) | function Bb(a,b){this.a=a;this.b=b}
function Cb (line 67) | function Cb(a){for(var b,c=[];;){W(a,"Missing right hand side of binary ...
function W (line 67) | function W(a,b){if(ib(a.a))throw Error(b);}
function Eb (line 67) | function Eb(a,b){var c=T(a.a);if(c!=b)throw Error("Bad token, expected: ...
function Fb (line 68) | function Fb(a){a=T(a.a);if(")"!=a)throw Error("Bad token: "+a);}
function Gb (line 68) | function Gb(a){a=T(a.a);if(2>a.length)throw Error("Unclosed literal stri...
function Hb (line 69) | function Hb(a){var b,c=[],d;if(ob(S(a.a))){b=T(a.a);d=S(a.a);if("/"==b&&...
function Ib (line 71) | function Ib(a,b){var c,d,e;if("/"!=b&&"//"!=b)throw Error('Step op shoul...
function Jb (line 73) | function Jb(a){for(var b=[];"["==S(a.a);){T(a.a);W(a,"Missing predicate ...
function Db (line 73) | function Db(a){if("-"==S(a.a))return T(a.a),new zb(Db(a));var b=Hb(a);if...
function Kb (line 73) | function Kb(a){switch(a.nodeType){case 1:return ea(Lb,a);case 9:return K...
function Mb (line 73) | function Mb(){return null}
function Lb (line 73) | function Lb(a,b){if(a.prefix==b)return a.namespaceURI||"http://www.w3.or...
function Nb (line 73) | function Nb(a,b){if(!a.length)throw Error("Empty XPath expression.");var...
function Y (line 74) | function Y(a,b){if(0==b)if(a instanceof C)b=4;else if("string"==typeof a...
function Ob (line 76) | function Ob(a){this.lookupNamespaceURI=Kb(a)}
function Pb (line 77) | function Pb(a,b){var c=a||k,d=c.Document&&c.Document.prototype||c.docume...
FILE: doc/third_party/MathJax-2.7.2/unpacked/jax/input/AsciiMath/jax.js
function createElementXHTML (line 362) | function createElementXHTML(t) {
function AMcreateElementMathML (line 369) | function AMcreateElementMathML(t) {
function createMmlNode (line 374) | function createMmlNode(t,frag) {
function newcommand (line 382) | function newcommand(oldstr,newstr) {
function newsymbol (line 387) | function newsymbol(symbolobj) {
function compareNames (line 661) | function compareNames(s1,s2) {
function initSymbols (line 668) | function initSymbols() {
function refreshSymbols (line 681) | function refreshSymbols(){
function define (line 687) | function define(oldstr,newstr) {
function AMremoveCharsAndBlanks (line 692) | function AMremoveCharsAndBlanks(str,n) {
function position (line 702) | function position(arr, str, n) {
function AMgetSymbol (line 719) | function AMgetSymbol(str) {
function AMremoveBrackets (line 780) | function AMremoveBrackets(node) {
function AMparseSexpr (line 806) | function AMparseSexpr(str) { //parses str and returns [node,tailstr]
function AMparseIexpr (line 984) | function AMparseIexpr(str) {
function AMparseExpr (line 1037) | function AMparseExpr(str,rightbracket) {
function parseMath (line 1134) | function parseMath(str,latex) {
FILE: doc/third_party/MathJax-2.7.2/unpacked/latest.js
function Error (line 48) | function Error(message) {
function getScript (line 52) | function getScript() {
function getCDN (line 64) | function getCDN(script) {
function getVersion (line 71) | function getVersion() {
function setVersion (line 76) | function setVersion(version) {
function getXMLHttpRequest (line 85) | function getXMLHttpRequest() {
function loadMathJax (line 93) | function loadMathJax(url) {
function loadDefaultMathJax (line 106) | function loadDefaultMathJax() {
function getLatestMathJax (line 115) | function getLatestMathJax(cdn,config,unpacked) {
FILE: examples/bazel/use_c_lib.c
function main (line 5) | int main(int argc, char **argv) {
FILE: examples/bazel/use_cpp_lib.cc
function main (line 4) | int main(int argc, char **argv) {
FILE: examples/cmake/main.cpp
function main (line 5) | int main(int argc, char **argv) {
FILE: include/libjsonnet++.h
function namespace (line 30) | namespace jsonnet {
FILE: include/libjsonnet.h
type JsonnetVm (line 43) | struct JsonnetVm
type JsonnetVm (line 46) | struct JsonnetVm
type JsonnetVm (line 49) | struct JsonnetVm
type JsonnetVm (line 52) | struct JsonnetVm
type JsonnetVm (line 55) | struct JsonnetVm
type JsonnetVm (line 58) | struct JsonnetVm
type JsonnetVm (line 61) | struct JsonnetVm
type JsonnetJsonValue (line 84) | struct JsonnetJsonValue
type JsonnetVm (line 88) | struct JsonnetVm
type JsonnetJsonValue (line 88) | struct JsonnetJsonValue
type JsonnetVm (line 92) | struct JsonnetVm
type JsonnetJsonValue (line 92) | struct JsonnetJsonValue
type JsonnetVm (line 97) | struct JsonnetVm
type JsonnetJsonValue (line 97) | struct JsonnetJsonValue
type JsonnetVm (line 101) | struct JsonnetVm
type JsonnetJsonValue (line 101) | struct JsonnetJsonValue
type JsonnetJsonValue (line 105) | struct JsonnetJsonValue
type JsonnetVm (line 105) | struct JsonnetVm
type JsonnetJsonValue (line 109) | struct JsonnetJsonValue
type JsonnetVm (line 109) | struct JsonnetVm
type JsonnetJsonValue (line 113) | struct JsonnetJsonValue
type JsonnetVm (line 113) | struct JsonnetVm
type JsonnetJsonValue (line 117) | struct JsonnetJsonValue
type JsonnetVm (line 117) | struct JsonnetVm
type JsonnetJsonValue (line 123) | struct JsonnetJsonValue
type JsonnetVm (line 123) | struct JsonnetVm
type JsonnetVm (line 127) | struct JsonnetVm
type JsonnetJsonValue (line 127) | struct JsonnetJsonValue
type JsonnetJsonValue (line 128) | struct JsonnetJsonValue
type JsonnetJsonValue (line 134) | struct JsonnetJsonValue
type JsonnetVm (line 134) | struct JsonnetVm
type JsonnetVm (line 140) | struct JsonnetVm
type JsonnetJsonValue (line 140) | struct JsonnetJsonValue
type JsonnetJsonValue (line 141) | struct JsonnetJsonValue
type JsonnetVm (line 147) | struct JsonnetVm
type JsonnetJsonValue (line 147) | struct JsonnetJsonValue
type JsonnetJsonValue (line 161) | struct JsonnetJsonValue
type JsonnetJsonValue (line 162) | struct JsonnetJsonValue
type JsonnetVm (line 172) | struct JsonnetVm
type JsonnetVm (line 176) | struct JsonnetVm
type JsonnetVm (line 191) | struct JsonnetVm
type JsonnetVm (line 198) | struct JsonnetVm
type JsonnetVm (line 204) | struct JsonnetVm
type JsonnetVm (line 210) | struct JsonnetVm
type JsonnetVm (line 216) | struct JsonnetVm
type JsonnetVm (line 219) | struct JsonnetVm
type JsonnetVm (line 229) | struct JsonnetVm
type JsonnetVm (line 239) | struct JsonnetVm
type JsonnetVm (line 250) | struct JsonnetVm
type JsonnetVm (line 262) | struct JsonnetVm
type JsonnetVm (line 274) | struct JsonnetVm
type JsonnetVm (line 286) | struct JsonnetVm
type JsonnetVm (line 298) | struct JsonnetVm
type JsonnetVm (line 302) | struct JsonnetVm
FILE: include/libjsonnet_fmt.h
type JsonnetVm (line 26) | struct JsonnetVm
type JsonnetVm (line 32) | struct JsonnetVm
type JsonnetVm (line 38) | struct JsonnetVm
type JsonnetVm (line 44) | struct JsonnetVm
type JsonnetVm (line 50) | struct JsonnetVm
type JsonnetVm (line 54) | struct JsonnetVm
type JsonnetVm (line 58) | struct JsonnetVm
type JsonnetVm (line 62) | struct JsonnetVm
type JsonnetVm (line 66) | struct JsonnetVm
type JsonnetVm (line 69) | struct JsonnetVm
type JsonnetVm (line 79) | struct JsonnetVm
type JsonnetVm (line 90) | struct JsonnetVm
FILE: java_comparison/BaseTemplate.java
class BaseTemplate (line 21) | public class BaseTemplate extends JsonnetObject {
method nonHiddenFields (line 22) | public Set<String> nonHiddenFields() {
method accessToken (line 29) | public Object accessToken() {
method image (line 34) | public Object image() { return "gcr.io/cooltool-1009/pipeline_image:la...
method extraEnv (line 35) | public Object[] extraEnv() { return new Object[]{}; }
method apiVersion (line 37) | public Object apiVersion() { return "v1"; }
method kind (line 38) | public Object kind() { return "ReplicationController"; }
class BaseTemplateSpec (line 40) | public class BaseTemplateSpec extends JsonnetObject {
method nonHiddenFields (line 41) | public Set<String> nonHiddenFields() {
method replicas (line 47) | public Object replicas() { return 1.0; }
class BaseTemplateSpecSpec (line 49) | public class BaseTemplateSpecSpec extends JsonnetObject {
method nonHiddenFields (line 50) | public Set<String> nonHiddenFields() {
class Container0 (line 56) | public class Container0 extends JsonnetObject {
method nonHiddenFields (line 57) | public Set<String> nonHiddenFields() {
class Env0 (line 63) | class Env0 extends JsonnetObject {
method nonHiddenFields (line 64) | public Set<String> nonHiddenFields() {
method name (line 69) | public Object name() { return "ACCESSTOKEN"; }
method value (line 70) | public Object value() { return BaseTemplate.this.accessToken(); }
method env (line 73) | public Object[] env() {
method image (line 81) | public Object image() { return BaseTemplate.this.image(); }
method name (line 82) | public Object name() { return "twitter-to-redis"; }
method containers (line 85) | public Object containers() { return new Object[] { new Container0(...
method spec (line 87) | public Object spec() { return new BaseTemplateSpecSpec(); }
method spec (line 90) | public Object spec() { return new BaseTemplateSpec(); }
FILE: java_comparison/JsonnetObject.java
class JsonnetObject (line 20) | public class JsonnetObject {
method nonHiddenFields (line 21) | public Set<String> nonHiddenFields() { return new HashSet<String>(){}; }
FILE: java_comparison/JsonnetValue.java
class JsonnetValue (line 22) | public class JsonnetValue {
method manifest (line 23) | public static String manifest(Object value) {
FILE: java_comparison/SubTemplate.java
class SubTemplate (line 17) | public class SubTemplate extends BaseTemplate {
method accessToken (line 19) | public String accessToken() {
method image (line 22) | public String image() {
class SubTemplateSpec (line 25) | public class SubTemplateSpec extends BaseTemplate.BaseTemplateSpec {
method replicas (line 26) | public Object replicas() { return 2.0; }
method spec (line 28) | public Object spec() {
FILE: java_comparison/Test.java
class Test (line 17) | public class Test {
method main (line 18) | public static void main(String[] args) {
FILE: python/_jsonnet.c
type StrRefAndObj (line 28) | struct StrRefAndObj {
function get_py_utf8_string (line 39) | static struct StrRefAndObj get_py_utf8_string(PyObject *unicode_obj) {
function release_py_utf8_string (line 67) | static void release_py_utf8_string(struct StrRefAndObj *utf8_obj) {
type JsonnetVm (line 76) | struct JsonnetVm
type JsonnetVm (line 84) | struct JsonnetVm
function exc_to_str (line 92) | static struct StrRefAndObj exc_to_str(void)
type NativeCtx (line 100) | struct NativeCtx {
type JsonnetJsonValue (line 107) | struct JsonnetJsonValue
type JsonnetVm (line 107) | struct JsonnetVm
type JsonnetJsonValue (line 111) | struct JsonnetJsonValue
type StrRefAndObj (line 112) | struct StrRefAndObj
type JsonnetJsonValue (line 126) | struct JsonnetJsonValue
type JsonnetJsonValue (line 132) | struct JsonnetJsonValue
type JsonnetJsonValue (line 145) | struct JsonnetJsonValue
type JsonnetJsonValue (line 150) | struct JsonnetJsonValue
type StrRefAndObj (line 151) | struct StrRefAndObj
type JsonnetJsonValue (line 177) | struct JsonnetJsonValue
type JsonnetJsonValue (line 178) | struct JsonnetJsonValue
type NativeCtx (line 180) | struct NativeCtx
type StrRefAndObj (line 221) | struct StrRefAndObj
type JsonnetJsonValue (line 222) | struct JsonnetJsonValue
type JsonnetJsonValue (line 231) | struct JsonnetJsonValue
type ImportCtx (line 243) | struct ImportCtx {
function cpython_import_callback (line 249) | static int cpython_import_callback(void *ctx_, const char *base, const c...
function PyObject (line 303) | static PyObject *handle_result(struct JsonnetVm *vm, char *out, int error)
function handle_vars (line 318) | int handle_vars(struct JsonnetVm *vm, PyObject *map, int code, int tla)
function handle_import_callback (line 355) | int handle_import_callback(struct ImportCtx *ctx, PyObject *import_callb...
function handle_native_callbacks (line 379) | static int handle_native_callbacks(struct JsonnetVm *vm, PyObject *nativ...
function PyObject (line 472) | static PyObject* evaluate_file(PyObject* self, PyObject* args, PyObject ...
function PyObject (line 553) | static PyObject* evaluate_snippet(PyObject* self, PyObject* args, PyObje...
type PyModuleDef (line 641) | struct PyModuleDef
function PyMODINIT_FUNC (line 650) | PyMODINIT_FUNC PyInit__jsonnet(void)
FILE: python/_jsonnet_test.py
function try_path_cached (line 27) | def try_path_cached(cache, dir, rel):
function import_callback_encode (line 44) | def import_callback_encode(dir, rel):
function import_callback_empty_file_encode (line 51) | def import_callback_empty_file_encode(dir, rel):
function concat (line 56) | def concat(a, b):
function return_types (line 60) | def return_types():
class JsonnetTests (line 79) | class JsonnetTests(unittest.TestCase):
method setUp (line 80) | def setUp(self):
method test_version (line 88) | def test_version(self):
method test_evaluate_file_encode (line 91) | def test_evaluate_file_encode(self):
method test_evaluate_snippet_encode (line 99) | def test_evaluate_snippet_encode(self):
method test_evaluate_snippet_encode (line 108) | def test_evaluate_snippet_encode(self):
method test_import_encode (line 117) | def test_import_encode(self):
method test_import_no_eol_encode (line 126) | def test_import_no_eol_encode(self):
method test_import_binary_encode (line 135) | def test_import_binary_encode(self):
method test_import_binary_sentinel_encode (line 144) | def test_import_binary_sentinel_encode(self):
method test_import_str_empty_file_encode (line 153) | def test_import_str_empty_file_encode(self):
method test_import_binary_empty_file_encode (line 162) | def test_import_binary_empty_file_encode(self):
method test_double_import (line 171) | def test_double_import(self):
FILE: setup.py
function get_version (line 42) | def get_version():
class BuildJsonnetExt (line 59) | class BuildJsonnetExt(BuildExt):
method _pack_std_jsonnet (line 60) | def _pack_std_jsonnet(self):
method build_extensions (line 68) | def build_extensions(self):
method run (line 98) | def run(self):
FILE: stdlib/to_c_array.cpp
function main (line 10) | int main(int argc, char *argv[])
FILE: third_party/json/nlohmann/json.hpp
type nlohmann (line 84) | namespace nlohmann
type detail (line 86) | namespace detail
type position_t (line 89) | struct position_t
class exception (line 145) | class exception : public std::exception
method exception (line 158) | exception(int id_, const char* what_arg) : id(id_), m(what_arg) {}
method name (line 160) | static std::string name(const std::string& ename, int id_)
class parse_error (line 214) | class parse_error : public exception
method parse_error (line 226) | static parse_error create(int id_, const position_t& pos, const st...
method parse_error (line 233) | static parse_error create(int id_, std::size_t byte_, const std::s...
method parse_error (line 253) | parse_error(int id_, std::size_t byte_, const char* what_arg)
method position_string (line 256) | static std::string position_string(const position_t& pos)
class invalid_iterator (line 300) | class invalid_iterator : public exception
method invalid_iterator (line 303) | static invalid_iterator create(int id_, const std::string& what_arg)
method invalid_iterator (line 310) | invalid_iterator(int id_, const char* what_arg)
class type_error (line 353) | class type_error : public exception
method type_error (line 356) | static type_error create(int id_, const std::string& what_arg)
method type_error (line 363) | type_error(int id_, const char* what_arg) : exception(id_, what_ar...
class out_of_range (line 399) | class out_of_range : public exception
method out_of_range (line 402) | static out_of_range create(int id_, const std::string& what_arg)
method out_of_range (line 409) | out_of_range(int id_, const char* what_arg) : exception(id_, what_...
class other_error (line 436) | class other_error : public exception
method other_error (line 439) | static other_error create(int id_, const std::string& what_arg)
method other_error (line 446) | other_error(int id_, const char* what_arg) : exception(id_, what_a...
type index_sequence (line 625) | struct index_sequence
method size (line 629) | static constexpr std::size_t size() noexcept
type merge_and_renumber (line 636) | struct merge_and_renumber
type make_index_sequence (line 643) | struct make_index_sequence
type make_index_sequence<0> (line 647) | struct make_index_sequence<0> : index_sequence<> {}
type make_index_sequence<1> (line 648) | struct make_index_sequence<1> : index_sequence<0> {}
type priority_tag (line 654) | struct priority_tag : priority_tag < N - 1 > {}
type priority_tag<0> (line 655) | struct priority_tag<0> {}
type static_const (line 659) | struct static_const
type make_void (line 689) | struct make_void
type iterator_types (line 705) | struct iterator_types {}
type iterator_types <
It,
void_t<typename It::difference_type, typename It::value_type, typename It::pointer,
typename It::reference, typename It::iterator_category >> (line 708) | struct iterator_types <
type iterator_traits (line 723) | struct iterator_traits
type iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >> (line 728) | struct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >>
type iterator_traits<T*, enable_if_t<std::is_object<T>::value>> (line 734) | struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>
type nonesuch (line 762) | struct nonesuch
method nonesuch (line 764) | nonesuch() = delete;
method nonesuch (line 766) | nonesuch(nonesuch const&) = delete;
method nonesuch (line 767) | nonesuch(nonesuch const&&) = delete;
type detector (line 776) | struct detector
type is_basic_json (line 902) | struct is_basic_json : std::false_type {}
type has_from_json (line 946) | struct has_from_json : std::false_type {}
type has_from_json<BasicJsonType, T,
enable_if_t<not is_basic_json<T>::value>> (line 949) | struct has_from_json<BasicJsonType, T,
type has_non_default_from_json (line 962) | struct has_non_default_from_json : std::false_type {}
type has_non_default_from_json<BasicJsonType, T, enable_if_t<not is_basic_json<T>::value>> (line 965) | struct has_non_default_from_json<BasicJsonType, T, enable_if_t<not i...
type has_to_json (line 977) | struct has_to_json : std::false_type {}
type has_to_json<BasicJsonType, T, enable_if_t<not is_basic_json<T>::value>> (line 980) | struct has_to_json<BasicJsonType, T, enable_if_t<not is_basic_json<T...
type is_iterator_traits (line 995) | struct is_iterator_traits : std::false_type {}
type is_iterator_traits<iterator_traits<T>> (line 998) | struct is_iterator_traits<iterator_traits<T>>
type is_complete_type (line 1015) | struct is_complete_type : std::false_type {}
type is_complete_type<T, decltype(void(sizeof(T)))> (line 1018) | struct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_ty...
type is_compatible_object_type_impl (line 1022) | struct is_compatible_object_type_impl : std::false_type {}
type is_compatible_object_type_impl <
BasicJsonType, CompatibleObjectType,
enable_if_t<is_detected<mapped_type_t, CompatibleObjectType>::value and
is_detected<key_type_t, CompatibleObjectType>::value >> (line 1025) | struct is_compatible_object_type_impl <
type is_compatible_object_type (line 1042) | struct is_compatible_object_type
type is_constructible_object_type_impl (line 1047) | struct is_constructible_object_type_impl : std::false_type {}
type is_constructible_object_type_impl <
BasicJsonType, ConstructibleObjectType,
enable_if_t<is_detected<mapped_type_t, ConstructibleObjectType>::value and
is_detected<key_type_t, ConstructibleObjectType>::value >> (line 1050) | struct is_constructible_object_type_impl <
type is_constructible_object_type (line 1065) | struct is_constructible_object_type
type is_compatible_string_type_impl (line 1071) | struct is_compatible_string_type_impl : std::false_type {}
type is_compatible_string_type_impl <
BasicJsonType, CompatibleStringType,
enable_if_t<is_detected_exact<typename BasicJsonType::string_t::value_type,
value_type_t, CompatibleStringType>::value >> (line 1074) | struct is_compatible_string_type_impl <
type is_compatible_string_type (line 1084) | struct is_compatible_string_type
type is_constructible_string_type_impl (line 1089) | struct is_constructible_string_type_impl : std::false_type {}
type is_constructible_string_type_impl <
BasicJsonType, ConstructibleStringType,
enable_if_t<is_detected_exact<typename BasicJsonType::string_t::value_type,
value_type_t, ConstructibleStringType>::value >> (line 1092) | struct is_constructible_string_type_impl <
type is_constructible_string_type (line 1103) | struct is_constructible_string_type
type is_compatible_array_type_impl (line 1107) | struct is_compatible_array_type_impl : std::false_type {}
type is_compatible_array_type (line 1126) | struct is_compatible_array_type
type is_constructible_array_type_impl (line 1130) | struct is_constructible_array_type_impl : std::false_type {}
type is_constructible_array_type_impl <
BasicJsonType, ConstructibleArrayType,
enable_if_t<std::is_same<ConstructibleArrayType,
typename BasicJsonType::value_type>::value >> (line 1133) | struct is_constructible_array_type_impl <
type is_constructible_array_type_impl <
BasicJsonType, ConstructibleArrayType,
enable_if_t<not std::is_same<ConstructibleArrayType,
typename BasicJsonType::value_type>::value and
is_detected<value_type_t, ConstructibleArrayType>::value and
is_detected<iterator_t, ConstructibleArrayType>::value and
is_complete_type<
detected_t<value_type_t, ConstructibleArrayType>>::value >> (line 1140) | struct is_constructible_array_type_impl <
type is_constructible_array_type (line 1165) | struct is_constructible_array_type
type is_compatible_integer_type_impl (line 1170) | struct is_compatible_integer_type_impl : std::false_type {}
type is_compatible_integer_type_impl <
RealIntegerType, CompatibleNumberIntegerType,
enable_if_t<std::is_integral<RealIntegerType>::value and
std::is_integral<CompatibleNumberIntegerType>::value and
not std::is_same<bool, CompatibleNumberIntegerType>::value >> (line 1173) | struct is_compatible_integer_type_impl <
type is_compatible_integer_type (line 1191) | struct is_compatible_integer_type
type is_compatible_type_impl (line 1196) | struct is_compatible_type_impl: std::false_type {}
type is_compatible_type_impl <
BasicJsonType, CompatibleType,
enable_if_t<is_complete_type<CompatibleType>::value >> (line 1199) | struct is_compatible_type_impl <
type is_compatible_type (line 1208) | struct is_compatible_type
type value_t (line 1254) | enum class value_t : std::uint8_t
function from_json (line 1298) | void from_json(const BasicJsonType& j, typename std::nullptr_t& n)
function get_arithmetic_value (line 1312) | void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val)
function from_json (line 1338) | void from_json(const BasicJsonType& j, typename BasicJsonType::boole...
function from_json (line 1348) | void from_json(const BasicJsonType& j, typename BasicJsonType::strin...
function from_json (line 1364) | void from_json(const BasicJsonType& j, ConstructibleStringType& s)
function from_json (line 1375) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
function from_json (line 1381) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
function from_json (line 1387) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
function from_json (line 1394) | void from_json(const BasicJsonType& j, EnumType& e)
function from_json (line 1404) | void from_json(const BasicJsonType& j, std::forward_list<T, Allocato...
function from_json (line 1420) | void from_json(const BasicJsonType& j, std::valarray<T>& l)
function from_json_array_impl (line 1431) | void from_json_array_impl(const BasicJsonType& j, typename BasicJson...
function from_json_array_impl (line 1437) | auto from_json_array_impl(const BasicJsonType& j, std::array<T, N>& ...
function from_json_array_impl (line 1448) | auto from_json_array_impl(const BasicJsonType& j, ConstructibleArray...
function from_json_array_impl (line 1467) | void from_json_array_impl(const BasicJsonType& j, ConstructibleArray...
function from_json (line 1490) | auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr)
function from_json (line 1506) | void from_json(const BasicJsonType& j, ConstructibleObjectType& obj)
function from_json (line 1536) | void from_json(const BasicJsonType& j, ArithmeticType& val)
function from_json (line 1567) | void from_json(const BasicJsonType& j, std::pair<A1, A2>& p)
function from_json_tuple_impl (line 1573) | void from_json_tuple_impl(const BasicJsonType& j, Tuple& t, index_se...
function from_json (line 1579) | void from_json(const BasicJsonType& j, std::tuple<Args...>& t)
function from_json (line 1587) | void from_json(const BasicJsonType& j, std::map<Key, Value, Compare,...
function from_json (line 1606) | void from_json(const BasicJsonType& j, std::unordered_map<Key, Value...
type from_json_fn (line 1622) | struct from_json_fn
class iteration_proxy_value (line 1673) | class iteration_proxy_value
method iteration_proxy_value (line 1695) | explicit iteration_proxy_value(IteratorType it) noexcept : anchor(...
method iteration_proxy_value (line 1698) | iteration_proxy_value& operator*()
method iteration_proxy_value (line 1704) | iteration_proxy_value& operator++()
method value (line 1753) | typename IteratorType::reference value() const
class iteration_proxy (line 1760) | class iteration_proxy
method iteration_proxy (line 1768) | explicit iteration_proxy(typename IteratorType::reference cont) no...
method begin (line 1772) | iteration_proxy_value<IteratorType> begin() noexcept
method end (line 1778) | iteration_proxy_value<IteratorType> end() noexcept
function get (line 1787) | auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>...
function get (line 1795) | auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>...
type external_constructor (line 1845) | struct external_constructor
type external_constructor<value_t::boolean> (line 1848) | struct external_constructor<value_t::boolean>
method construct (line 1851) | static void construct(BasicJsonType& j, typename BasicJsonType::bo...
type external_constructor<value_t::string> (line 1860) | struct external_constructor<value_t::string>
method construct (line 1863) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
method construct (line 1871) | static void construct(BasicJsonType& j, typename BasicJsonType::st...
method construct (line 1881) | static void construct(BasicJsonType& j, const CompatibleStringType...
type external_constructor<value_t::number_float> (line 1890) | struct external_constructor<value_t::number_float>
method construct (line 1893) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
type external_constructor<value_t::number_unsigned> (line 1902) | struct external_constructor<value_t::number_unsigned>
method construct (line 1905) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
type external_constructor<value_t::number_integer> (line 1914) | struct external_constructor<value_t::number_integer>
method construct (line 1917) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
type external_constructor<value_t::array> (line 1926) | struct external_constructor<value_t::array>
method construct (line 1929) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
method construct (line 1937) | static void construct(BasicJsonType& j, typename BasicJsonType::ar...
method construct (line 1947) | static void construct(BasicJsonType& j, const CompatibleArrayType&...
method construct (line 1957) | static void construct(BasicJsonType& j, const std::vector<bool>& arr)
method construct (line 1971) | static void construct(BasicJsonType& j, const std::valarray<T>& arr)
type external_constructor<value_t::object> (line 1982) | struct external_constructor<value_t::object>
method construct (line 1985) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
method construct (line 1993) | static void construct(BasicJsonType& j, typename BasicJsonType::ob...
method construct (line 2002) | static void construct(BasicJsonType& j, const CompatibleObjectType...
function to_json (line 2019) | void to_json(BasicJsonType& j, T b) noexcept
function to_json (line 2026) | void to_json(BasicJsonType& j, const CompatibleString& s)
function to_json (line 2032) | void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s)
function to_json (line 2039) | void to_json(BasicJsonType& j, FloatType val) noexcept
function to_json (line 2046) | void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noe...
function to_json (line 2053) | void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noex...
function to_json (line 2060) | void to_json(BasicJsonType& j, EnumType e) noexcept
function to_json (line 2067) | void to_json(BasicJsonType& j, const std::vector<bool>& e)
function to_json (line 2080) | void to_json(BasicJsonType& j, const CompatibleArrayType& arr)
function to_json (line 2087) | void to_json(BasicJsonType& j, const std::valarray<T>& arr)
function to_json (line 2093) | void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr)
function to_json (line 2100) | void to_json(BasicJsonType& j, const CompatibleObjectType& obj)
function to_json (line 2106) | void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj)
function to_json (line 2116) | void to_json(BasicJsonType& j, const T(&arr)[N])
function to_json (line 2122) | void to_json(BasicJsonType& j, const std::pair<Args...>& p)
function to_json (line 2130) | void to_json(BasicJsonType& j, const T& b)
function to_json_tuple_impl (line 2136) | void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequ...
function to_json (line 2142) | void to_json(BasicJsonType& j, const std::tuple<Args...>& t)
type to_json_fn (line 2147) | struct to_json_fn
type input_format_t (line 2259) | enum class input_format_t { json, cbor, msgpack, ubjson, bson }
type input_adapter_protocol (line 2276) | struct input_adapter_protocol
class file_input_adapter (line 2290) | class file_input_adapter : public input_adapter_protocol
method file_input_adapter (line 2293) | explicit file_input_adapter(std::FILE* f) noexcept
method file_input_adapter (line 2298) | file_input_adapter(const file_input_adapter&) = delete;
method file_input_adapter (line 2299) | file_input_adapter(file_input_adapter&&) = default;
method file_input_adapter (line 2300) | file_input_adapter& operator=(const file_input_adapter&) = delete;
method file_input_adapter (line 2301) | file_input_adapter& operator=(file_input_adapter&&) = default;
method get_character (line 2304) | std::char_traits<char>::int_type get_character() noexcept override
class input_stream_adapter (line 2324) | class input_stream_adapter : public input_adapter_protocol
method input_stream_adapter (line 2334) | explicit input_stream_adapter(std::istream& i)
method input_stream_adapter (line 2339) | input_stream_adapter(const input_stream_adapter&) = delete;
method input_stream_adapter (line 2340) | input_stream_adapter& operator=(input_stream_adapter&) = delete;
method input_stream_adapter (line 2341) | input_stream_adapter(input_stream_adapter&&) = delete;
method input_stream_adapter (line 2342) | input_stream_adapter& operator=(input_stream_adapter&&) = delete;
method get_character (line 2347) | std::char_traits<char>::int_type get_character() override
class input_buffer_adapter (line 2365) | class input_buffer_adapter : public input_adapter_protocol
method input_buffer_adapter (line 2368) | input_buffer_adapter(const char* b, const std::size_t l) noexcept
method input_buffer_adapter (line 2373) | input_buffer_adapter(const input_buffer_adapter&) = delete;
method input_buffer_adapter (line 2374) | input_buffer_adapter& operator=(input_buffer_adapter&) = delete;
method input_buffer_adapter (line 2375) | input_buffer_adapter(input_buffer_adapter&&) = delete;
method input_buffer_adapter (line 2376) | input_buffer_adapter& operator=(input_buffer_adapter&&) = delete;
method get_character (line 2379) | std::char_traits<char>::int_type get_character() noexcept override
type wide_string_input_helper (line 2397) | struct wide_string_input_helper
method fill_buffer (line 2400) | static void fill_buffer(const WideStringType& str,
type wide_string_input_helper<WideStringType, 2> (line 2456) | struct wide_string_input_helper<WideStringType, 2>
method fill_buffer (line 2459) | static void fill_buffer(const WideStringType& str,
class wide_string_input_adapter (line 2521) | class wide_string_input_adapter : public input_adapter_protocol
method wide_string_input_adapter (line 2524) | explicit wide_string_input_adapter(const WideStringType& w) noexcept
method get_character (line 2528) | std::char_traits<char>::int_type get_character() noexcept override
method fill_buffer (line 2547) | void fill_buffer()
class input_adapter (line 2567) | class input_adapter
method input_adapter (line 2571) | input_adapter(std::FILE* file)
method input_adapter (line 2574) | input_adapter(std::istream& i)
method input_adapter (line 2578) | input_adapter(std::istream&& i)
method input_adapter (line 2581) | input_adapter(const std::wstring& ws)
method input_adapter (line 2584) | input_adapter(const std::u16string& ws)
method input_adapter (line 2587) | input_adapter(const std::u32string& ws)
method input_adapter (line 2597) | input_adapter(CharT b, std::size_t l)
method input_adapter (line 2609) | input_adapter(CharT b)
method input_adapter (line 2618) | input_adapter(IteratorType first, IteratorType last)
method input_adapter (line 2653) | input_adapter(T (&array)[N])
method input_adapter (line 2661) | input_adapter(const ContiguousContainer& c)
class json_sax_dom_parser (line 2823) | class json_sax_dom_parser
method json_sax_dom_parser (line 2836) | explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_ex...
method json_sax_dom_parser (line 2841) | json_sax_dom_parser(const json_sax_dom_parser&) = delete;
method json_sax_dom_parser (line 2842) | json_sax_dom_parser(json_sax_dom_parser&&) = default;
method json_sax_dom_parser (line 2843) | json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete;
method json_sax_dom_parser (line 2844) | json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default;
method null (line 2847) | bool null()
method boolean (line 2853) | bool boolean(bool val)
method number_integer (line 2859) | bool number_integer(number_integer_t val)
method number_unsigned (line 2865) | bool number_unsigned(number_unsigned_t val)
method number_float (line 2871) | bool number_float(number_float_t val, const string_t& /*unused*/)
method string (line 2877) | bool string(string_t& val)
method start_object (line 2883) | bool start_object(std::size_t len)
method key (line 2896) | bool key(string_t& val)
method end_object (line 2903) | bool end_object()
method start_array (line 2909) | bool start_array(std::size_t len)
method end_array (line 2922) | bool end_array()
method parse_error (line 2928) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
method is_errored (line 2956) | constexpr bool is_errored() const
method BasicJsonType (line 2969) | BasicJsonType* handle_value(Value&& v)
class json_sax_dom_callback_parser (line 3004) | class json_sax_dom_callback_parser
method json_sax_dom_callback_parser (line 3014) | json_sax_dom_callback_parser(BasicJsonType& r,
method json_sax_dom_callback_parser (line 3023) | json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) ...
method json_sax_dom_callback_parser (line 3024) | json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = def...
method json_sax_dom_callback_parser (line 3025) | json_sax_dom_callback_parser& operator=(const json_sax_dom_callbac...
method json_sax_dom_callback_parser (line 3026) | json_sax_dom_callback_parser& operator=(json_sax_dom_callback_pars...
method null (line 3029) | bool null()
method boolean (line 3035) | bool boolean(bool val)
method number_integer (line 3041) | bool number_integer(number_integer_t val)
method number_unsigned (line 3047) | bool number_unsigned(number_unsigned_t val)
method number_float (line 3053) | bool number_float(number_float_t val, const string_t& /*unused*/)
method string (line 3059) | bool string(string_t& val)
method start_object (line 3065) | bool start_object(std::size_t len)
method key (line 3083) | bool key(string_t& val)
method end_object (line 3100) | bool end_object()
method start_array (line 3129) | bool start_array(std::size_t len)
method end_array (line 3146) | bool end_array()
method parse_error (line 3174) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
method is_errored (line 3202) | constexpr bool is_errored() const
method handle_value (line 3224) | std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool...
class json_sax_acceptor (line 3308) | class json_sax_acceptor
method null (line 3316) | bool null()
method boolean (line 3321) | bool boolean(bool /*unused*/)
method number_integer (line 3326) | bool number_integer(number_integer_t /*unused*/)
method number_unsigned (line 3331) | bool number_unsigned(number_unsigned_t /*unused*/)
method number_float (line 3336) | bool number_float(number_float_t /*unused*/, const string_t& /*unu...
method string (line 3341) | bool string(string_t& /*unused*/)
method start_object (line 3346) | bool start_object(std::size_t /*unused*/ = std::size_t(-1))
method key (line 3351) | bool key(string_t& /*unused*/)
method end_object (line 3356) | bool end_object()
method start_array (line 3361) | bool start_array(std::size_t /*unused*/ = std::size_t(-1))
method end_array (line 3366) | bool end_array()
method parse_error (line 3371) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
type is_sax (line 3445) | struct is_sax
type is_sax_static_asserts (line 3477) | struct is_sax_static_asserts
class binary_reader (line 3543) | class binary_reader
method binary_reader (line 3557) | explicit binary_reader(input_adapter_t adapter) : ia(std::move(ada...
method binary_reader (line 3564) | binary_reader(const binary_reader&) = delete;
method binary_reader (line 3565) | binary_reader(binary_reader&&) = default;
method binary_reader (line 3566) | binary_reader& operator=(const binary_reader&) = delete;
method binary_reader (line 3567) | binary_reader& operator=(binary_reader&&) = default;
method sax_parse (line 3577) | bool sax_parse(const input_format_t format,
method little_endianess (line 3635) | static constexpr bool little_endianess(int num = 1) noexcept
method parse_bson_internal (line 3649) | bool parse_bson_internal()
method get_bson_cstr (line 3674) | bool get_bson_cstr(string_t& result)
method get_bson_string (line 3706) | bool get_bson_string(const NumberType len, string_t& result)
method parse_bson_element_internal (line 3727) | bool parse_bson_element_internal(const int element_type,
method parse_bson_element_list (line 3798) | bool parse_bson_element_list(const bool is_array)
method parse_bson_array (line 3835) | bool parse_bson_array()
method parse_cbor_internal (line 3864) | bool parse_cbor_internal(const bool get_char = true)
method get_cbor_string (line 4206) | bool get_cbor_string(string_t& result)
method get_cbor_array (line 4295) | bool get_cbor_array(const std::size_t len)
method get_cbor_object (line 4331) | bool get_cbor_object(const std::size_t len)
method parse_msgpack_internal (line 4383) | bool parse_msgpack_internal()
method get_msgpack_string (line 4752) | bool get_msgpack_string(string_t& result)
method get_msgpack_array (line 4828) | bool get_msgpack_array(const std::size_t len)
method get_msgpack_object (line 4850) | bool get_msgpack_object(const std::size_t len)
method parse_ubjson_internal (line 4887) | bool parse_ubjson_internal(const bool get_char = true)
method get_ubjson_string (line 4906) | bool get_ubjson_string(string_t& result, const bool get_char = true)
method get_ubjson_size_value (line 4960) | bool get_ubjson_size_value(std::size_t& result)
method get_ubjson_size_type (line 5037) | bool get_ubjson_size_type(std::pair<std::size_t, int>& result)
method get_ubjson_value (line 5078) | bool get_ubjson_value(const int prefix)
method get_ubjson_array (line 5174) | bool get_ubjson_array()
method get_ubjson_object (line 5236) | bool get_ubjson_object()
method get (line 5321) | int get()
method get_ignore_noop (line 5330) | int get_ignore_noop()
method get_number (line 5355) | bool get_number(const input_format_t format, NumberType& result)
method get_string (line 5398) | bool get_string(const input_format_t format,
method unexpect_eof (line 5420) | bool unexpect_eof(const input_format_t format, const char* context...
method get_token_string (line 5433) | std::string get_token_string() const
method exception_message (line 5446) | std::string exception_message(const input_format_t format,
class lexer (line 5532) | class lexer
type token_type (line 5541) | enum class token_type
method lexer (line 5606) | explicit lexer(detail::input_adapter_t&& adapter)
method lexer (line 5610) | lexer(const lexer&) = delete;
method lexer (line 5611) | lexer(lexer&&) = delete;
method lexer (line 5612) | lexer& operator=(lexer&) = delete;
method lexer (line 5613) | lexer& operator=(lexer&&) = delete;
method get_decimal_point (line 5622) | static char get_decimal_point() noexcept
method get_codepoint (line 5648) | int get_codepoint()
method next_byte_in_range (line 5696) | bool next_byte_in_range(std::initializer_list<int> ranges)
method token_type (line 5733) | token_type scan_string()
method strtof (line 6319) | static void strtof(float& f, const char* str, char** endptr) noexcept
method strtof (line 6324) | static void strtof(double& f, const char* str, char** endptr) noex...
method strtof (line 6329) | static void strtof(long double& f, const char* str, char** endptr)...
method token_type (line 6374) | token_type scan_number() // lgtm [cpp/use-of-goto]
method token_type (line 6704) | token_type scan_literal(const char* literal_text, const std::size_...
method reset (line 6724) | void reset() noexcept
method get (line 6741) | std::char_traits<char>::int_type get()
method unget (line 6778) | void unget()
method add (line 6805) | void add(int c)
method number_integer_t (line 6816) | constexpr number_integer_t get_number_integer() const noexcept
method number_unsigned_t (line 6822) | constexpr number_unsigned_t get_number_unsigned() const noexcept
method number_float_t (line 6828) | constexpr number_float_t get_number_float() const noexcept
method string_t (line 6834) | string_t& get_string()
method position_t (line 6844) | constexpr position_t get_position() const noexcept
method get_token_string (line 6852) | std::string get_token_string() const
method skip_bom (line 6889) | bool skip_bom()
method token_type (line 6903) | token_type scan()
class parser (line 7047) | class parser
type parse_event_t (line 7057) | enum class parse_event_t : uint8_t
method parser (line 7077) | explicit parser(detail::input_adapter_t&& adapter,
method parse (line 7096) | void parse(const bool strict, BasicJsonType& result)
method accept (line 7157) | bool accept(const bool strict = true)
method sax_parse (line 7164) | bool sax_parse(SAX* sax, const bool strict = true)
method sax_parse_internal (line 7183) | bool sax_parse_internal(SAX* sax)
method token_type (line 7465) | token_type get_token()
method exception_message (line 7470) | std::string exception_message(const token_type expected, const std...
class primitive_iterator_t (line 7534) | class primitive_iterator_t
method difference_type (line 7545) | constexpr difference_type get_value() const noexcept
method set_begin (line 7551) | void set_begin() noexcept
method set_end (line 7557) | void set_end() noexcept
method is_begin (line 7563) | constexpr bool is_begin() const noexcept
method is_end (line 7569) | constexpr bool is_end() const noexcept
method primitive_iterator_t (line 7584) | primitive_iterator_t operator+(difference_type n) noexcept
method difference_type (line 7591) | constexpr difference_type operator-(primitive_iterator_t lhs, prim...
method primitive_iterator_t (line 7596) | primitive_iterator_t& operator++() noexcept
method primitive_iterator_t (line 7602) | primitive_iterator_t const operator++(int) noexcept
method primitive_iterator_t (line 7609) | primitive_iterator_t& operator--() noexcept
method primitive_iterator_t (line 7615) | primitive_iterator_t const operator--(int) noexcept
method primitive_iterator_t (line 7622) | primitive_iterator_t& operator+=(difference_type n) noexcept
method primitive_iterator_t (line 7628) | primitive_iterator_t& operator-=(difference_type n) noexcept
type internal_iterator (line 7648) | struct internal_iterator
class iteration_proxy (line 7687) | class iteration_proxy
method iteration_proxy (line 1768) | explicit iteration_proxy(typename IteratorType::reference cont) no...
method begin (line 1772) | iteration_proxy_value<IteratorType> begin() noexcept
method end (line 1778) | iteration_proxy_value<IteratorType> end() noexcept
class iteration_proxy_value (line 7688) | class iteration_proxy_value
method iteration_proxy_value (line 1695) | explicit iteration_proxy_value(IteratorType it) noexcept : anchor(...
method iteration_proxy_value (line 1698) | iteration_proxy_value& operator*()
method iteration_proxy_value (line 1704) | iteration_proxy_value& operator++()
method value (line 1753) | typename IteratorType::reference value() const
class iter_impl (line 7707) | class iter_impl
method iter_impl (line 7745) | iter_impl() = default;
method iter_impl (line 7753) | explicit iter_impl(pointer object) noexcept : m_object(object)
method iter_impl (line 7793) | iter_impl(const iter_impl<typename std::remove_const<BasicJsonType...
method iter_impl (line 7802) | iter_impl& operator=(const iter_impl<typename std::remove_const<Ba...
method set_begin (line 7814) | void set_begin() noexcept
method set_end (line 7851) | void set_end() noexcept
method reference (line 7882) | reference operator*() const
method pointer (line 7919) | pointer operator->() const
method iter_impl (line 7953) | iter_impl const operator++(int)
method iter_impl (line 7964) | iter_impl& operator++()
method iter_impl (line 7996) | iter_impl const operator--(int)
method iter_impl (line 8007) | iter_impl& operator--()
method iter_impl (line 8129) | iter_impl& operator+=(difference_type i)
method iter_impl (line 8158) | iter_impl& operator-=(difference_type i)
method iter_impl (line 8167) | iter_impl operator+(difference_type i) const
method iter_impl (line 8178) | iter_impl operator+(difference_type i, const iter_impl& it)
method iter_impl (line 8189) | iter_impl operator-(difference_type i) const
method difference_type (line 8200) | difference_type operator-(const iter_impl& other) const
method reference (line 8221) | reference operator[](difference_type n) const
method reference (line 8268) | reference value() const
class json_reverse_iterator (line 8318) | class json_reverse_iterator : public std::reverse_iterator<Base>
method json_reverse_iterator (line 8328) | explicit json_reverse_iterator(const typename base_iterator::itera...
method json_reverse_iterator (line 8332) | explicit json_reverse_iterator(const base_iterator& it) noexcept :...
method json_reverse_iterator (line 8335) | json_reverse_iterator const operator++(int)
method json_reverse_iterator (line 8341) | json_reverse_iterator& operator++()
method json_reverse_iterator (line 8347) | json_reverse_iterator const operator--(int)
method json_reverse_iterator (line 8353) | json_reverse_iterator& operator--()
method json_reverse_iterator (line 8359) | json_reverse_iterator& operator+=(difference_type i)
method json_reverse_iterator (line 8365) | json_reverse_iterator operator+(difference_type i) const
method json_reverse_iterator (line 8371) | json_reverse_iterator operator-(difference_type i) const
method difference_type (line 8377) | difference_type operator-(const json_reverse_iterator& other) const
method reference (line 8383) | reference operator[](difference_type n) const
method key (line 8389) | auto key() const -> decltype(std::declval<Base>().key())
method reference (line 8396) | reference value() const
class json_ref (line 9365) | class json_ref
method json_ref (line 9370) | json_ref(value_type&& value)
method json_ref (line 9374) | json_ref(const value_type& value)
method json_ref (line 9378) | json_ref(std::initializer_list<json_ref> init)
method json_ref (line 9385) | json_ref(Args && ... args)
method json_ref (line 9390) | json_ref(json_ref&&) = default;
method json_ref (line 9391) | json_ref(const json_ref&) = delete;
method json_ref (line 9392) | json_ref& operator=(const json_ref&) = delete;
method json_ref (line 9393) | json_ref& operator=(json_ref&&) = delete;
method value_type (line 9396) | value_type moved_or_copied() const
method value_type (line 9405) | value_type const& operator*() const
method value_type (line 9410) | value_type const* operator->() const
type output_adapter_protocol (line 9458) | struct output_adapter_protocol
class output_vector_adapter (line 9471) | class output_vector_adapter : public output_adapter_protocol<CharType>
method output_vector_adapter (line 9474) | explicit output_vector_adapter(std::vector<CharType>& vec) noexcept
method write_character (line 9478) | void write_character(CharType c) override
method write_characters (line 9483) | void write_characters(const CharType* s, std::size_t length) override
class output_stream_adapter (line 9494) | class output_stream_adapter : public output_adapter_protocol<CharType>
method output_stream_adapter (line 9497) | explicit output_stream_adapter(std::basic_ostream<CharType>& s) no...
method write_character (line 9501) | void write_character(CharType c) override
method write_characters (line 9506) | void write_characters(const CharType* s, std::size_t length) override
class output_string_adapter (line 9517) | class output_string_adapter : public output_adapter_protocol<CharType>
method output_string_adapter (line 9520) | explicit output_string_adapter(StringType& s) noexcept
method write_character (line 9524) | void write_character(CharType c) override
method write_characters (line 9529) | void write_characters(const CharType* s, std::size_t length) override
class output_adapter (line 9539) | class output_adapter
method output_adapter (line 9542) | output_adapter(std::vector<CharType>& vec)
method output_adapter (line 9545) | output_adapter(std::basic_ostream<CharType>& s)
method output_adapter (line 9548) | output_adapter(StringType& s)
class binary_writer (line 9575) | class binary_writer
method binary_writer (line 9585) | explicit binary_writer(output_adapter_t<CharType> adapter) : oa(ad...
method write_bson (line 9594) | void write_bson(const BasicJsonType& j)
method write_cbor (line 9614) | void write_cbor(const BasicJsonType& j)
method write_msgpack (line 9858) | void write_msgpack(const BasicJsonType& j)
method write_ubjson (line 10100) | void write_ubjson(const BasicJsonType& j, const bool use_count,
method calc_bson_entry_header_size (line 10264) | static std::size_t calc_bson_entry_header_size(const string_t& name)
method write_bson_entry_header (line 10279) | void write_bson_entry_header(const string_t& name,
method write_bson_boolean (line 10291) | void write_bson_boolean(const string_t& name,
method write_bson_double (line 10301) | void write_bson_double(const string_t& name,
method calc_bson_string_size (line 10311) | static std::size_t calc_bson_string_size(const string_t& value)
method write_bson_string (line 10319) | void write_bson_string(const string_t& name,
method write_bson_null (line 10333) | void write_bson_null(const string_t& name)
method calc_bson_integer_size (line 10341) | static std::size_t calc_bson_integer_size(const std::int64_t value)
method write_bson_integer (line 10351) | void write_bson_integer(const string_t& name,
method calc_bson_unsigned_size (line 10369) | static constexpr std::size_t calc_bson_unsigned_size(const std::ui...
method write_bson_unsigned (line 10379) | void write_bson_unsigned(const string_t& name,
method write_bson_object_entry (line 10401) | void write_bson_object_entry(const string_t& name,
method calc_bson_array_size (line 10411) | static std::size_t calc_bson_array_size(const typename BasicJsonTy...
method write_bson_array (line 10427) | void write_bson_array(const string_t& name,
method calc_bson_element_size (line 10447) | static std::size_t calc_bson_element_size(const string_t& name,
method write_bson_element (line 10492) | void write_bson_element(const string_t& name,
method calc_bson_object_size (line 10535) | static std::size_t calc_bson_object_size(const typename BasicJsonT...
method write_bson_object (line 10550) | void write_bson_object(const typename BasicJsonType::object_t& value)
method CharType (line 10566) | static constexpr CharType get_cbor_float_prefix(float /*unused*/)
method CharType (line 10571) | static constexpr CharType get_cbor_float_prefix(double /*unused*/)
method CharType (line 10580) | static constexpr CharType get_msgpack_float_prefix(float /*unused*/)
method CharType (line 10585) | static constexpr CharType get_msgpack_float_prefix(double /*unused*/)
method write_number_with_ubjson_prefix (line 10597) | void write_number_with_ubjson_prefix(const NumberType n,
method write_number_with_ubjson_prefix (line 10610) | void write_number_with_ubjson_prefix(const NumberType n,
method write_number_with_ubjson_prefix (line 10663) | void write_number_with_ubjson_prefix(const NumberType n,
method CharType (line 10723) | CharType ubjson_prefix(const BasicJsonType& j) const noexcept
method CharType (line 10794) | static constexpr CharType get_ubjson_float_prefix(float /*unused*/)
method CharType (line 10799) | static constexpr CharType get_ubjson_float_prefix(double /*unused*/)
method write_number (line 10820) | void write_number(const NumberType n)
method CharType (line 10843) | static constexpr CharType to_char_type(std::uint8_t x) noexcept
method CharType (line 10850) | static CharType to_char_type(std::uint8_t x) noexcept
method CharType (line 10861) | static constexpr CharType to_char_type(std::uint8_t x) noexcept
method CharType (line 10872) | static constexpr CharType to_char_type(InputCharType x) noexcept
type dtoa_impl (line 10942) | namespace dtoa_impl
function Target (line 10946) | Target reinterpret_bits(const Source source)
type diyfp (line 10955) | struct diyfp // f * 2^e
method diyfp (line 10962) | constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_...
method diyfp (line 10968) | static diyfp sub(const diyfp& x, const diyfp& y) noexcept
method diyfp (line 10980) | static diyfp mul(const diyfp& x, const diyfp& y) noexcept
method diyfp (line 11045) | static diyfp normalize(diyfp x) noexcept
method diyfp (line 11062) | static diyfp normalize_to(const diyfp& x, const int target_expon...
type boundaries (line 11073) | struct boundaries
function boundaries (line 11087) | boundaries compute_boundaries(FloatType value)
type cached_power (line 11212) | struct cached_power // c = f * 2^e ~= 10^k
function cached_power (line 11226) | inline cached_power get_cached_power_for_binary_exponent(int e)
function find_largest_pow10 (line 11390) | inline int find_largest_pow10(const std::uint32_t n, std::uint32_t...
function grisu2_round (line 11446) | inline void grisu2_round(char* buf, int len, std::uint64_t dist, s...
function grisu2_digit_gen (line 11487) | inline void grisu2_digit_gen(char* buffer, int& length, int& decim...
function grisu2 (line 11727) | inline void grisu2(char* buf, int& len, int& decimal_exponent,
function grisu2 (line 11786) | void grisu2(char* buf, int& len, int& decimal_exponent, FloatType ...
type error_handler_t (line 12027) | enum class error_handler_t
class serializer (line 12035) | class serializer
method serializer (line 12050) | serializer(output_adapter_t<char> s, const char ichar,
method serializer (line 12062) | serializer(const serializer&) = delete;
method serializer (line 12063) | serializer& operator=(const serializer&) = delete;
method serializer (line 12064) | serializer(serializer&&) = delete;
method serializer (line 12065) | serializer& operator=(serializer&&) = delete;
method dump (line 12085) | void dump(const BasicJsonType& val, const bool pretty_print,
method dump_escaped (line 12295) | void dump_escaped(const string_t& s, const bool ensure_ascii)
method count_digits (line 12551) | inline unsigned int count_digits(number_unsigned_t x) noexcept
method dump_integer (line 12590) | void dump_integer(NumberType x)
method dump_float (line 12676) | void dump_float(number_float_t x)
method dump_float (line 12697) | void dump_float(number_float_t x, std::true_type /*is_ieee_single_...
method dump_float (line 12705) | void dump_float(number_float_t x, std::false_type /*is_ieee_single...
method decode (line 12775) | static std::uint8_t decode(std::uint8_t& state, std::uint32_t& cod...
type detail (line 111) | namespace detail
type position_t (line 89) | struct position_t
class exception (line 145) | class exception : public std::exception
method exception (line 158) | exception(int id_, const char* what_arg) : id(id_), m(what_arg) {}
method name (line 160) | static std::string name(const std::string& ename, int id_)
class parse_error (line 214) | class parse_error : public exception
method parse_error (line 226) | static parse_error create(int id_, const position_t& pos, const st...
method parse_error (line 233) | static parse_error create(int id_, std::size_t byte_, const std::s...
method parse_error (line 253) | parse_error(int id_, std::size_t byte_, const char* what_arg)
method position_string (line 256) | static std::string position_string(const position_t& pos)
class invalid_iterator (line 300) | class invalid_iterator : public exception
method invalid_iterator (line 303) | static invalid_iterator create(int id_, const std::string& what_arg)
method invalid_iterator (line 310) | invalid_iterator(int id_, const char* what_arg)
class type_error (line 353) | class type_error : public exception
method type_error (line 356) | static type_error create(int id_, const std::string& what_arg)
method type_error (line 363) | type_error(int id_, const char* what_arg) : exception(id_, what_ar...
class out_of_range (line 399) | class out_of_range : public exception
method out_of_range (line 402) | static out_of_range create(int id_, const std::string& what_arg)
method out_of_range (line 409) | out_of_range(int id_, const char* what_arg) : exception(id_, what_...
class other_error (line 436) | class other_error : public exception
method other_error (line 439) | static other_error create(int id_, const std::string& what_arg)
method other_error (line 446) | other_error(int id_, const char* what_arg) : exception(id_, what_a...
type index_sequence (line 625) | struct index_sequence
method size (line 629) | static constexpr std::size_t size() noexcept
type merge_and_renumber (line 636) | struct merge_and_renumber
type make_index_sequence (line 643) | struct make_index_sequence
type make_index_sequence<0> (line 647) | struct make_index_sequence<0> : index_sequence<> {}
type make_index_sequence<1> (line 648) | struct make_index_sequence<1> : index_sequence<0> {}
type priority_tag (line 654) | struct priority_tag : priority_tag < N - 1 > {}
type priority_tag<0> (line 655) | struct priority_tag<0> {}
type static_const (line 659) | struct static_const
type make_void (line 689) | struct make_void
type iterator_types (line 705) | struct iterator_types {}
type iterator_types <
It,
void_t<typename It::difference_type, typename It::value_type, typename It::pointer,
typename It::reference, typename It::iterator_category >> (line 708) | struct iterator_types <
type iterator_traits (line 723) | struct iterator_traits
type iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >> (line 728) | struct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >>
type iterator_traits<T*, enable_if_t<std::is_object<T>::value>> (line 734) | struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>
type nonesuch (line 762) | struct nonesuch
method nonesuch (line 764) | nonesuch() = delete;
method nonesuch (line 766) | nonesuch(nonesuch const&) = delete;
method nonesuch (line 767) | nonesuch(nonesuch const&&) = delete;
type detector (line 776) | struct detector
type is_basic_json (line 902) | struct is_basic_json : std::false_type {}
type has_from_json (line 946) | struct has_from_json : std::false_type {}
type has_from_json<BasicJsonType, T,
enable_if_t<not is_basic_json<T>::value>> (line 949) | struct has_from_json<BasicJsonType, T,
type has_non_default_from_json (line 962) | struct has_non_default_from_json : std::false_type {}
type has_non_default_from_json<BasicJsonType, T, enable_if_t<not is_basic_json<T>::value>> (line 965) | struct has_non_default_from_json<BasicJsonType, T, enable_if_t<not i...
type has_to_json (line 977) | struct has_to_json : std::false_type {}
type has_to_json<BasicJsonType, T, enable_if_t<not is_basic_json<T>::value>> (line 980) | struct has_to_json<BasicJsonType, T, enable_if_t<not is_basic_json<T...
type is_iterator_traits (line 995) | struct is_iterator_traits : std::false_type {}
type is_iterator_traits<iterator_traits<T>> (line 998) | struct is_iterator_traits<iterator_traits<T>>
type is_complete_type (line 1015) | struct is_complete_type : std::false_type {}
type is_complete_type<T, decltype(void(sizeof(T)))> (line 1018) | struct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_ty...
type is_compatible_object_type_impl (line 1022) | struct is_compatible_object_type_impl : std::false_type {}
type is_compatible_object_type_impl <
BasicJsonType, CompatibleObjectType,
enable_if_t<is_detected<mapped_type_t, CompatibleObjectType>::value and
is_detected<key_type_t, CompatibleObjectType>::value >> (line 1025) | struct is_compatible_object_type_impl <
type is_compatible_object_type (line 1042) | struct is_compatible_object_type
type is_constructible_object_type_impl (line 1047) | struct is_constructible_object_type_impl : std::false_type {}
type is_constructible_object_type_impl <
BasicJsonType, ConstructibleObjectType,
enable_if_t<is_detected<mapped_type_t, ConstructibleObjectType>::value and
is_detected<key_type_t, ConstructibleObjectType>::value >> (line 1050) | struct is_constructible_object_type_impl <
type is_constructible_object_type (line 1065) | struct is_constructible_object_type
type is_compatible_string_type_impl (line 1071) | struct is_compatible_string_type_impl : std::false_type {}
type is_compatible_string_type_impl <
BasicJsonType, CompatibleStringType,
enable_if_t<is_detected_exact<typename BasicJsonType::string_t::value_type,
value_type_t, CompatibleStringType>::value >> (line 1074) | struct is_compatible_string_type_impl <
type is_compatible_string_type (line 1084) | struct is_compatible_string_type
type is_constructible_string_type_impl (line 1089) | struct is_constructible_string_type_impl : std::false_type {}
type is_constructible_string_type_impl <
BasicJsonType, ConstructibleStringType,
enable_if_t<is_detected_exact<typename BasicJsonType::string_t::value_type,
value_type_t, ConstructibleStringType>::value >> (line 1092) | struct is_constructible_string_type_impl <
type is_constructible_string_type (line 1103) | struct is_constructible_string_type
type is_compatible_array_type_impl (line 1107) | struct is_compatible_array_type_impl : std::false_type {}
type is_compatible_array_type (line 1126) | struct is_compatible_array_type
type is_constructible_array_type_impl (line 1130) | struct is_constructible_array_type_impl : std::false_type {}
type is_constructible_array_type_impl <
BasicJsonType, ConstructibleArrayType,
enable_if_t<std::is_same<ConstructibleArrayType,
typename BasicJsonType::value_type>::value >> (line 1133) | struct is_constructible_array_type_impl <
type is_constructible_array_type_impl <
BasicJsonType, ConstructibleArrayType,
enable_if_t<not std::is_same<ConstructibleArrayType,
typename BasicJsonType::value_type>::value and
is_detected<value_type_t, ConstructibleArrayType>::value and
is_detected<iterator_t, ConstructibleArrayType>::value and
is_complete_type<
detected_t<value_type_t, ConstructibleArrayType>>::value >> (line 1140) | struct is_constructible_array_type_impl <
type is_constructible_array_type (line 1165) | struct is_constructible_array_type
type is_compatible_integer_type_impl (line 1170) | struct is_compatible_integer_type_impl : std::false_type {}
type is_compatible_integer_type_impl <
RealIntegerType, CompatibleNumberIntegerType,
enable_if_t<std::is_integral<RealIntegerType>::value and
std::is_integral<CompatibleNumberIntegerType>::value and
not std::is_same<bool, CompatibleNumberIntegerType>::value >> (line 1173) | struct is_compatible_integer_type_impl <
type is_compatible_integer_type (line 1191) | struct is_compatible_integer_type
type is_compatible_type_impl (line 1196) | struct is_compatible_type_impl: std::false_type {}
type is_compatible_type_impl <
BasicJsonType, CompatibleType,
enable_if_t<is_complete_type<CompatibleType>::value >> (line 1199) | struct is_compatible_type_impl <
type is_compatible_type (line 1208) | struct is_compatible_type
type value_t (line 1254) | enum class value_t : std::uint8_t
function from_json (line 1298) | void from_json(const BasicJsonType& j, typename std::nullptr_t& n)
function get_arithmetic_value (line 1312) | void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val)
function from_json (line 1338) | void from_json(const BasicJsonType& j, typename BasicJsonType::boole...
function from_json (line 1348) | void from_json(const BasicJsonType& j, typename BasicJsonType::strin...
function from_json (line 1364) | void from_json(const BasicJsonType& j, ConstructibleStringType& s)
function from_json (line 1375) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
function from_json (line 1381) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
function from_json (line 1387) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
function from_json (line 1394) | void from_json(const BasicJsonType& j, EnumType& e)
function from_json (line 1404) | void from_json(const BasicJsonType& j, std::forward_list<T, Allocato...
function from_json (line 1420) | void from_json(const BasicJsonType& j, std::valarray<T>& l)
function from_json_array_impl (line 1431) | void from_json_array_impl(const BasicJsonType& j, typename BasicJson...
function from_json_array_impl (line 1437) | auto from_json_array_impl(const BasicJsonType& j, std::array<T, N>& ...
function from_json_array_impl (line 1448) | auto from_json_array_impl(const BasicJsonType& j, ConstructibleArray...
function from_json_array_impl (line 1467) | void from_json_array_impl(const BasicJsonType& j, ConstructibleArray...
function from_json (line 1490) | auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr)
function from_json (line 1506) | void from_json(const BasicJsonType& j, ConstructibleObjectType& obj)
function from_json (line 1536) | void from_json(const BasicJsonType& j, ArithmeticType& val)
function from_json (line 1567) | void from_json(const BasicJsonType& j, std::pair<A1, A2>& p)
function from_json_tuple_impl (line 1573) | void from_json_tuple_impl(const BasicJsonType& j, Tuple& t, index_se...
function from_json (line 1579) | void from_json(const BasicJsonType& j, std::tuple<Args...>& t)
function from_json (line 1587) | void from_json(const BasicJsonType& j, std::map<Key, Value, Compare,...
function from_json (line 1606) | void from_json(const BasicJsonType& j, std::unordered_map<Key, Value...
type from_json_fn (line 1622) | struct from_json_fn
class iteration_proxy_value (line 1673) | class iteration_proxy_value
method iteration_proxy_value (line 1695) | explicit iteration_proxy_value(IteratorType it) noexcept : anchor(...
method iteration_proxy_value (line 1698) | iteration_proxy_value& operator*()
method iteration_proxy_value (line 1704) | iteration_proxy_value& operator++()
method value (line 1753) | typename IteratorType::reference value() const
class iteration_proxy (line 1760) | class iteration_proxy
method iteration_proxy (line 1768) | explicit iteration_proxy(typename IteratorType::reference cont) no...
method begin (line 1772) | iteration_proxy_value<IteratorType> begin() noexcept
method end (line 1778) | iteration_proxy_value<IteratorType> end() noexcept
function get (line 1787) | auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>...
function get (line 1795) | auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>...
type external_constructor (line 1845) | struct external_constructor
type external_constructor<value_t::boolean> (line 1848) | struct external_constructor<value_t::boolean>
method construct (line 1851) | static void construct(BasicJsonType& j, typename BasicJsonType::bo...
type external_constructor<value_t::string> (line 1860) | struct external_constructor<value_t::string>
method construct (line 1863) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
method construct (line 1871) | static void construct(BasicJsonType& j, typename BasicJsonType::st...
method construct (line 1881) | static void construct(BasicJsonType& j, const CompatibleStringType...
type external_constructor<value_t::number_float> (line 1890) | struct external_constructor<value_t::number_float>
method construct (line 1893) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
type external_constructor<value_t::number_unsigned> (line 1902) | struct external_constructor<value_t::number_unsigned>
method construct (line 1905) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
type external_constructor<value_t::number_integer> (line 1914) | struct external_constructor<value_t::number_integer>
method construct (line 1917) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
type external_constructor<value_t::array> (line 1926) | struct external_constructor<value_t::array>
method construct (line 1929) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
method construct (line 1937) | static void construct(BasicJsonType& j, typename BasicJsonType::ar...
method construct (line 1947) | static void construct(BasicJsonType& j, const CompatibleArrayType&...
method construct (line 1957) | static void construct(BasicJsonType& j, const std::vector<bool>& arr)
method construct (line 1971) | static void construct(BasicJsonType& j, const std::valarray<T>& arr)
type external_constructor<value_t::object> (line 1982) | struct external_constructor<value_t::object>
method construct (line 1985) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
method construct (line 1993) | static void construct(BasicJsonType& j, typename BasicJsonType::ob...
method construct (line 2002) | static void construct(BasicJsonType& j, const CompatibleObjectType...
function to_json (line 2019) | void to_json(BasicJsonType& j, T b) noexcept
function to_json (line 2026) | void to_json(BasicJsonType& j, const CompatibleString& s)
function to_json (line 2032) | void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s)
function to_json (line 2039) | void to_json(BasicJsonType& j, FloatType val) noexcept
function to_json (line 2046) | void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noe...
function to_json (line 2053) | void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noex...
function to_json (line 2060) | void to_json(BasicJsonType& j, EnumType e) noexcept
function to_json (line 2067) | void to_json(BasicJsonType& j, const std::vector<bool>& e)
function to_json (line 2080) | void to_json(BasicJsonType& j, const CompatibleArrayType& arr)
function to_json (line 2087) | void to_json(BasicJsonType& j, const std::valarray<T>& arr)
function to_json (line 2093) | void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr)
function to_json (line 2100) | void to_json(BasicJsonType& j, const CompatibleObjectType& obj)
function to_json (line 2106) | void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj)
function to_json (line 2116) | void to_json(BasicJsonType& j, const T(&arr)[N])
function to_json (line 2122) | void to_json(BasicJsonType& j, const std::pair<Args...>& p)
function to_json (line 2130) | void to_json(BasicJsonType& j, const T& b)
function to_json_tuple_impl (line 2136) | void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequ...
function to_json (line 2142) | void to_json(BasicJsonType& j, const std::tuple<Args...>& t)
type to_json_fn (line 2147) | struct to_json_fn
type input_format_t (line 2259) | enum class input_format_t { json, cbor, msgpack, ubjson, bson }
type input_adapter_protocol (line 2276) | struct input_adapter_protocol
class file_input_adapter (line 2290) | class file_input_adapter : public input_adapter_protocol
method file_input_adapter (line 2293) | explicit file_input_adapter(std::FILE* f) noexcept
method file_input_adapter (line 2298) | file_input_adapter(const file_input_adapter&) = delete;
method file_input_adapter (line 2299) | file_input_adapter(file_input_adapter&&) = default;
method file_input_adapter (line 2300) | file_input_adapter& operator=(const file_input_adapter&) = delete;
method file_input_adapter (line 2301) | file_input_adapter& operator=(file_input_adapter&&) = default;
method get_character (line 2304) | std::char_traits<char>::int_type get_character() noexcept override
class input_stream_adapter (line 2324) | class input_stream_adapter : public input_adapter_protocol
method input_stream_adapter (line 2334) | explicit input_stream_adapter(std::istream& i)
method input_stream_adapter (line 2339) | input_stream_adapter(const input_stream_adapter&) = delete;
method input_stream_adapter (line 2340) | input_stream_adapter& operator=(input_stream_adapter&) = delete;
method input_stream_adapter (line 2341) | input_stream_adapter(input_stream_adapter&&) = delete;
method input_stream_adapter (line 2342) | input_stream_adapter& operator=(input_stream_adapter&&) = delete;
method get_character (line 2347) | std::char_traits<char>::int_type get_character() override
class input_buffer_adapter (line 2365) | class input_buffer_adapter : public input_adapter_protocol
method input_buffer_adapter (line 2368) | input_buffer_adapter(const char* b, const std::size_t l) noexcept
method input_buffer_adapter (line 2373) | input_buffer_adapter(const input_buffer_adapter&) = delete;
method input_buffer_adapter (line 2374) | input_buffer_adapter& operator=(input_buffer_adapter&) = delete;
method input_buffer_adapter (line 2375) | input_buffer_adapter(input_buffer_adapter&&) = delete;
method input_buffer_adapter (line 2376) | input_buffer_adapter& operator=(input_buffer_adapter&&) = delete;
method get_character (line 2379) | std::char_traits<char>::int_type get_character() noexcept override
type wide_string_input_helper (line 2397) | struct wide_string_input_helper
method fill_buffer (line 2400) | static void fill_buffer(const WideStringType& str,
type wide_string_input_helper<WideStringType, 2> (line 2456) | struct wide_string_input_helper<WideStringType, 2>
method fill_buffer (line 2459) | static void fill_buffer(const WideStringType& str,
class wide_string_input_adapter (line 2521) | class wide_string_input_adapter : public input_adapter_protocol
method wide_string_input_adapter (line 2524) | explicit wide_string_input_adapter(const WideStringType& w) noexcept
method get_character (line 2528) | std::char_traits<char>::int_type get_character() noexcept override
method fill_buffer (line 2547) | void fill_buffer()
class input_adapter (line 2567) | class input_adapter
method input_adapter (line 2571) | input_adapter(std::FILE* file)
method input_adapter (line 2574) | input_adapter(std::istream& i)
method input_adapter (line 2578) | input_adapter(std::istream&& i)
method input_adapter (line 2581) | input_adapter(const std::wstring& ws)
method input_adapter (line 2584) | input_adapter(const std::u16string& ws)
method input_adapter (line 2587) | input_adapter(const std::u32string& ws)
method input_adapter (line 2597) | input_adapter(CharT b, std::size_t l)
method input_adapter (line 2609) | input_adapter(CharT b)
method input_adapter (line 2618) | input_adapter(IteratorType first, IteratorType last)
method input_adapter (line 2653) | input_adapter(T (&array)[N])
method input_adapter (line 2661) | input_adapter(const ContiguousContainer& c)
class json_sax_dom_parser (line 2823) | class json_sax_dom_parser
method json_sax_dom_parser (line 2836) | explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_ex...
method json_sax_dom_parser (line 2841) | json_sax_dom_parser(const json_sax_dom_parser&) = delete;
method json_sax_dom_parser (line 2842) | json_sax_dom_parser(json_sax_dom_parser&&) = default;
method json_sax_dom_parser (line 2843) | json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete;
method json_sax_dom_parser (line 2844) | json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default;
method null (line 2847) | bool null()
method boolean (line 2853) | bool boolean(bool val)
method number_integer (line 2859) | bool number_integer(number_integer_t val)
method number_unsigned (line 2865) | bool number_unsigned(number_unsigned_t val)
method number_float (line 2871) | bool number_float(number_float_t val, const string_t& /*unused*/)
method string (line 2877) | bool string(string_t& val)
method start_object (line 2883) | bool start_object(std::size_t len)
method key (line 2896) | bool key(string_t& val)
method end_object (line 2903) | bool end_object()
method start_array (line 2909) | bool start_array(std::size_t len)
method end_array (line 2922) | bool end_array()
method parse_error (line 2928) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
method is_errored (line 2956) | constexpr bool is_errored() const
method BasicJsonType (line 2969) | BasicJsonType* handle_value(Value&& v)
class json_sax_dom_callback_parser (line 3004) | class json_sax_dom_callback_parser
method json_sax_dom_callback_parser (line 3014) | json_sax_dom_callback_parser(BasicJsonType& r,
method json_sax_dom_callback_parser (line 3023) | json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) ...
method json_sax_dom_callback_parser (line 3024) | json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = def...
method json_sax_dom_callback_parser (line 3025) | json_sax_dom_callback_parser& operator=(const json_sax_dom_callbac...
method json_sax_dom_callback_parser (line 3026) | json_sax_dom_callback_parser& operator=(json_sax_dom_callback_pars...
method null (line 3029) | bool null()
method boolean (line 3035) | bool boolean(bool val)
method number_integer (line 3041) | bool number_integer(number_integer_t val)
method number_unsigned (line 3047) | bool number_unsigned(number_unsigned_t val)
method number_float (line 3053) | bool number_float(number_float_t val, const string_t& /*unused*/)
method string (line 3059) | bool string(string_t& val)
method start_object (line 3065) | bool start_object(std::size_t len)
method key (line 3083) | bool key(string_t& val)
method end_object (line 3100) | bool end_object()
method start_array (line 3129) | bool start_array(std::size_t len)
method end_array (line 3146) | bool end_array()
method parse_error (line 3174) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
method is_errored (line 3202) | constexpr bool is_errored() const
method handle_value (line 3224) | std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool...
class json_sax_acceptor (line 3308) | class json_sax_acceptor
method null (line 3316) | bool null()
method boolean (line 3321) | bool boolean(bool /*unused*/)
method number_integer (line 3326) | bool number_integer(number_integer_t /*unused*/)
method number_unsigned (line 3331) | bool number_unsigned(number_unsigned_t /*unused*/)
method number_float (line 3336) | bool number_float(number_float_t /*unused*/, const string_t& /*unu...
method string (line 3341) | bool string(string_t& /*unused*/)
method start_object (line 3346) | bool start_object(std::size_t /*unused*/ = std::size_t(-1))
method key (line 3351) | bool key(string_t& /*unused*/)
method end_object (line 3356) | bool end_object()
method start_array (line 3361) | bool start_array(std::size_t /*unused*/ = std::size_t(-1))
method end_array (line 3366) | bool end_array()
method parse_error (line 3371) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
type is_sax (line 3445) | struct is_sax
type is_sax_static_asserts (line 3477) | struct is_sax_static_asserts
class binary_reader (line 3543) | class binary_reader
method binary_reader (line 3557) | explicit binary_reader(input_adapter_t adapter) : ia(std::move(ada...
method binary_reader (line 3564) | binary_reader(const binary_reader&) = delete;
method binary_reader (line 3565) | binary_reader(binary_reader&&) = default;
method binary_reader (line 3566) | binary_reader& operator=(const binary_reader&) = delete;
method binary_reader (line 3567) | binary_reader& operator=(binary_reader&&) = default;
method sax_parse (line 3577) | bool sax_parse(const input_format_t format,
method little_endianess (line 3635) | static constexpr bool little_endianess(int num = 1) noexcept
method parse_bson_internal (line 3649) | bool parse_bson_internal()
method get_bson_cstr (line 3674) | bool get_bson_cstr(string_t& result)
method get_bson_string (line 3706) | bool get_bson_string(const NumberType len, string_t& result)
method parse_bson_element_internal (line 3727) | bool parse_bson_element_internal(const int element_type,
method parse_bson_element_list (line 3798) | bool parse_bson_element_list(const bool is_array)
method parse_bson_array (line 3835) | bool parse_bson_array()
method parse_cbor_internal (line 3864) | bool parse_cbor_internal(const bool get_char = true)
method get_cbor_string (line 4206) | bool get_cbor_string(string_t& result)
method get_cbor_array (line 4295) | bool get_cbor_array(const std::size_t len)
method get_cbor_object (line 4331) | bool get_cbor_object(const std::size_t len)
method parse_msgpack_internal (line 4383) | bool parse_msgpack_internal()
method get_msgpack_string (line 4752) | bool get_msgpack_string(string_t& result)
method get_msgpack_array (line 4828) | bool get_msgpack_array(const std::size_t len)
method get_msgpack_object (line 4850) | bool get_msgpack_object(const std::size_t len)
method parse_ubjson_internal (line 4887) | bool parse_ubjson_internal(const bool get_char = true)
method get_ubjson_string (line 4906) | bool get_ubjson_string(string_t& result, const bool get_char = true)
method get_ubjson_size_value (line 4960) | bool get_ubjson_size_value(std::size_t& result)
method get_ubjson_size_type (line 5037) | bool get_ubjson_size_type(std::pair<std::size_t, int>& result)
method get_ubjson_value (line 5078) | bool get_ubjson_value(const int prefix)
method get_ubjson_array (line 5174) | bool get_ubjson_array()
method get_ubjson_object (line 5236) | bool get_ubjson_object()
method get (line 5321) | int get()
method get_ignore_noop (line 5330) | int get_ignore_noop()
method get_number (line 5355) | bool get_number(const input_format_t format, NumberType& result)
method get_string (line 5398) | bool get_string(const input_format_t format,
method unexpect_eof (line 5420) | bool unexpect_eof(const input_format_t format, const char* context...
method get_token_string (line 5433) | std::string get_token_string() const
method exception_message (line 5446) | std::string exception_message(const input_format_t format,
class lexer (line 5532) | class lexer
type token_type (line 5541) | enum class token_type
method lexer (line 5606) | explicit lexer(detail::input_adapter_t&& adapter)
method lexer (line 5610) | lexer(const lexer&) = delete;
method lexer (line 5611) | lexer(lexer&&) = delete;
method lexer (line 5612) | lexer& operator=(lexer&) = delete;
method lexer (line 5613) | lexer& operator=(lexer&&) = delete;
method get_decimal_point (line 5622) | static char get_decimal_point() noexcept
method get_codepoint (line 5648) | int get_codepoint()
method next_byte_in_range (line 5696) | bool next_byte_in_range(std::initializer_list<int> ranges)
method token_type (line 5733) | token_type scan_string()
method strtof (line 6319) | static void strtof(float& f, const char* str, char** endptr) noexcept
method strtof (line 6324) | static void strtof(double& f, const char* str, char** endptr) noex...
method strtof (line 6329) | static void strtof(long double& f, const char* str, char** endptr)...
method token_type (line 6374) | token_type scan_number() // lgtm [cpp/use-of-goto]
method token_type (line 6704) | token_type scan_literal(const char* literal_text, const std::size_...
method reset (line 6724) | void reset() noexcept
method get (line 6741) | std::char_traits<char>::int_type get()
method unget (line 6778) | void unget()
method add (line 6805) | void add(int c)
method number_integer_t (line 6816) | constexpr number_integer_t get_number_integer() const noexcept
method number_unsigned_t (line 6822) | constexpr number_unsigned_t get_number_unsigned() const noexcept
method number_float_t (line 6828) | constexpr number_float_t get_number_float() const noexcept
method string_t (line 6834) | string_t& get_string()
method position_t (line 6844) | constexpr position_t get_position() const noexcept
method get_token_string (line 6852) | std::string get_token_string() const
method skip_bom (line 6889) | bool skip_bom()
method token_type (line 6903) | token_type scan()
class parser (line 7047) | class parser
type parse_event_t (line 7057) | enum class parse_event_t : uint8_t
method parser (line 7077) | explicit parser(detail::input_adapter_t&& adapter,
method parse (line 7096) | void parse(const bool strict, BasicJsonType& result)
method accept (line 7157) | bool accept(const bool strict = true)
method sax_parse (line 7164) | bool sax_parse(SAX* sax, const bool strict = true)
method sax_parse_internal (line 7183) | bool sax_parse_internal(SAX* sax)
method token_type (line 7465) | token_type get_token()
method exception_message (line 7470) | std::string exception_message(const token_type expected, const std...
class primitive_iterator_t (line 7534) | class primitive_iterator_t
method difference_type (line 7545) | constexpr difference_type get_value() const noexcept
method set_begin (line 7551) | void set_begin() noexcept
method set_end (line 7557) | void set_end() noexcept
method is_begin (line 7563) | constexpr bool is_begin() const noexcept
method is_end (line 7569) | constexpr bool is_end() const noexcept
method primitive_iterator_t (line 7584) | primitive_iterator_t operator+(difference_type n) noexcept
method difference_type (line 7591) | constexpr difference_type operator-(primitive_iterator_t lhs, prim...
method primitive_iterator_t (line 7596) | primitive_iterator_t& operator++() noexcept
method primitive_iterator_t (line 7602) | primitive_iterator_t const operator++(int) noexcept
method primitive_iterator_t (line 7609) | primitive_iterator_t& operator--() noexcept
method primitive_iterator_t (line 7615) | primitive_iterator_t const operator--(int) noexcept
method primitive_iterator_t (line 7622) | primitive_iterator_t& operator+=(difference_type n) noexcept
method primitive_iterator_t (line 7628) | primitive_iterator_t& operator-=(difference_type n) noexcept
type internal_iterator (line 7648) | struct internal_iterator
class iteration_proxy (line 7687) | class iteration_proxy
method iteration_proxy (line 1768) | explicit iteration_proxy(typename IteratorType::reference cont) no...
method begin (line 1772) | iteration_proxy_value<IteratorType> begin() noexcept
method end (line 1778) | iteration_proxy_value<IteratorType> end() noexcept
class iteration_proxy_value (line 7688) | class iteration_proxy_value
method iteration_proxy_value (line 1695) | explicit iteration_proxy_value(IteratorType it) noexcept : anchor(...
method iteration_proxy_value (line 1698) | iteration_proxy_value& operator*()
method iteration_proxy_value (line 1704) | iteration_proxy_value& operator++()
method value (line 1753) | typename IteratorType::reference value() const
class iter_impl (line 7707) | class iter_impl
method iter_impl (line 7745) | iter_impl() = default;
method iter_impl (line 7753) | explicit iter_impl(pointer object) noexcept : m_object(object)
method iter_impl (line 7793) | iter_impl(const iter_impl<typename std::remove_const<BasicJsonType...
method iter_impl (line 7802) | iter_impl& operator=(const iter_impl<typename std::remove_const<Ba...
method set_begin (line 7814) | void set_begin() noexcept
method set_end (line 7851) | void set_end() noexcept
method reference (line 7882) | reference operator*() const
method pointer (line 7919) | pointer operator->() const
method iter_impl (line 7953) | iter_impl const operator++(int)
method iter_impl (line 7964) | iter_impl& operator++()
method iter_impl (line 7996) | iter_impl const operator--(int)
method iter_impl (line 8007) | iter_impl& operator--()
method iter_impl (line 8129) | iter_impl& operator+=(difference_type i)
method iter_impl (line 8158) | iter_impl& operator-=(difference_type i)
method iter_impl (line 8167) | iter_impl operator+(difference_type i) const
method iter_impl (line 8178) | iter_impl operator+(difference_type i, const iter_impl& it)
method iter_impl (line 8189) | iter_impl operator-(difference_type i) const
method difference_type (line 8200) | difference_type operator-(const iter_impl& other) const
method reference (line 8221) | reference operator[](difference_type n) const
method reference (line 8268) | reference value() const
class json_reverse_iterator (line 8318) | class json_reverse_iterator : public std::reverse_iterator<Base>
method json_reverse_iterator (line 8328) | explicit json_reverse_iterator(const typename base_iterator::itera...
method json_reverse_iterator (line 8332) | explicit json_reverse_iterator(const base_iterator& it) noexcept :...
method json_reverse_iterator (line 8335) | json_reverse_iterator const operator++(int)
method json_reverse_iterator (line 8341) | json_reverse_iterator& operator++()
method json_reverse_iterator (line 8347) | json_reverse_iterator const operator--(int)
method json_reverse_iterator (line 8353) | json_reverse_iterator& operator--()
method json_reverse_iterator (line 8359) | json_reverse_iterator& operator+=(difference_type i)
method json_reverse_iterator (line 8365) | json_reverse_iterator operator+(difference_type i) const
method json_reverse_iterator (line 8371) | json_reverse_iterator operator-(difference_type i) const
method difference_type (line 8377) | difference_type operator-(const json_reverse_iterator& other) const
method reference (line 8383) | reference operator[](difference_type n) const
method key (line 8389) | auto key() const -> decltype(std::declval<Base>().key())
method reference (line 8396) | reference value() const
class json_ref (line 9365) | class json_ref
method json_ref (line 9370) | json_ref(value_type&& value)
method json_ref (line 9374) | json_ref(const value_type& value)
method json_ref (line 9378) | json_ref(std::initializer_list<json_ref> init)
method json_ref (line 9385) | json_ref(Args && ... args)
method json_ref (line 9390) | json_ref(json_ref&&) = default;
method json_ref (line 9391) | json_ref(const json_ref&) = delete;
method json_ref (line 9392) | json_ref& operator=(const json_ref&) = delete;
method json_ref (line 9393) | json_ref& operator=(json_ref&&) = delete;
method value_type (line 9396) | value_type moved_or_copied() const
method value_type (line 9405) | value_type const& operator*() const
method value_type (line 9410) | value_type const* operator->() const
type output_adapter_protocol (line 9458) | struct output_adapter_protocol
class output_vector_adapter (line 9471) | class output_vector_adapter : public output_adapter_protocol<CharType>
method output_vector_adapter (line 9474) | explicit output_vector_adapter(std::vector<CharType>& vec) noexcept
method write_character (line 9478) | void write_character(CharType c) override
method write_characters (line 9483) | void write_characters(const CharType* s, std::size_t length) override
class output_stream_adapter (line 9494) | class output_stream_adapter : public output_adapter_protocol<CharType>
method output_stream_adapter (line 9497) | explicit output_stream_adapter(std::basic_ostream<CharType>& s) no...
method write_character (line 9501) | void write_character(CharType c) override
method write_characters (line 9506) | void write_characters(const CharType* s, std::size_t length) override
class output_string_adapter (line 9517) | class output_string_adapter : public output_adapter_protocol<CharType>
method output_string_adapter (line 9520) | explicit output_string_adapter(StringType& s) noexcept
method write_character (line 9524) | void write_character(CharType c) override
method write_characters (line 9529) | void write_characters(const CharType* s, std::size_t length) override
class output_adapter (line 9539) | class output_adapter
method output_adapter (line 9542) | output_adapter(std::vector<CharType>& vec)
method output_adapter (line 9545) | output_adapter(std::basic_ostream<CharType>& s)
method output_adapter (line 9548) | output_adapter(StringType& s)
class binary_writer (line 9575) | class binary_writer
method binary_writer (line 9585) | explicit binary_writer(output_adapter_t<CharType> adapter) : oa(ad...
method write_bson (line 9594) | void write_bson(const BasicJsonType& j)
method write_cbor (line 9614) | void write_cbor(const BasicJsonType& j)
method write_msgpack (line 9858) | void write_msgpack(const BasicJsonType& j)
method write_ubjson (line 10100) | void write_ubjson(const BasicJsonType& j, const bool use_count,
method calc_bson_entry_header_size (line 10264) | static std::size_t calc_bson_entry_header_size(const string_t& name)
method write_bson_entry_header (line 10279) | void write_bson_entry_header(const string_t& name,
method write_bson_boolean (line 10291) | void write_bson_boolean(const string_t& name,
method write_bson_double (line 10301) | void write_bson_double(const string_t& name,
method calc_bson_string_size (line 10311) | static std::size_t calc_bson_string_size(const string_t& value)
method write_bson_string (line 10319) | void write_bson_string(const string_t& name,
method write_bson_null (line 10333) | void write_bson_null(const string_t& name)
method calc_bson_integer_size (line 10341) | static std::size_t calc_bson_integer_size(const std::int64_t value)
method write_bson_integer (line 10351) | void write_bson_integer(const string_t& name,
method calc_bson_unsigned_size (line 10369) | static constexpr std::size_t calc_bson_unsigned_size(const std::ui...
method write_bson_unsigned (line 10379) | void write_bson_unsigned(const string_t& name,
method write_bson_object_entry (line 10401) | void write_bson_object_entry(const string_t& name,
method calc_bson_array_size (line 10411) | static std::size_t calc_bson_array_size(const typename BasicJsonTy...
method write_bson_array (line 10427) | void write_bson_array(const string_t& name,
method calc_bson_element_size (line 10447) | static std::size_t calc_bson_element_size(const string_t& name,
method write_bson_element (line 10492) | void write_bson_element(const string_t& name,
method calc_bson_object_size (line 10535) | static std::size_t calc_bson_object_size(const typename BasicJsonT...
method write_bson_object (line 10550) | void write_bson_object(const typename BasicJsonType::object_t& value)
method CharType (line 10566) | static constexpr CharType get_cbor_float_prefix(float /*unused*/)
method CharType (line 10571) | static constexpr CharType get_cbor_float_prefix(double /*unused*/)
method CharType (line 10580) | static constexpr CharType get_msgpack_float_prefix(float /*unused*/)
method CharType (line 10585) | static constexpr CharType get_msgpack_float_prefix(double /*unused*/)
method write_number_with_ubjson_prefix (line 10597) | void write_number_with_ubjson_prefix(const NumberType n,
method write_number_with_ubjson_prefix (line 10610) | void write_number_with_ubjson_prefix(const NumberType n,
method write_number_with_ubjson_prefix (line 10663) | void write_number_with_ubjson_prefix(const NumberType n,
method CharType (line 10723) | CharType ubjson_prefix(const BasicJsonType& j) const noexcept
method CharType (line 10794) | static constexpr CharType get_ubjson_float_prefix(float /*unused*/)
method CharType (line 10799) | static constexpr CharType get_ubjson_float_prefix(double /*unused*/)
method write_number (line 10820) | void write_number(const NumberType n)
method CharType (line 10843) | static constexpr CharType to_char_type(std::uint8_t x) noexcept
method CharType (line 10850) | static CharType to_char_type(std::uint8_t x) noexcept
method CharType (line 10861) | static constexpr CharType to_char_type(std::uint8_t x) noexcept
method CharType (line 10872) | static constexpr CharType to_char_type(InputCharType x) noexcept
type dtoa_impl (line 10942) | namespace dtoa_impl
function Target (line 10946) | Target reinterpret_bits(const Source source)
type diyfp (line 10955) | struct diyfp // f * 2^e
method diyfp (line 10962) | constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_...
method diyfp (line 10968) | static diyfp sub(const diyfp& x, const diyfp& y) noexcept
method diyfp (line 10980) | static diyfp mul(const diyfp& x, const diyfp& y) noexcept
method diyfp (line 11045) | static diyfp normalize(diyfp x) noexcept
method diyfp (line 11062) | static diyfp normalize_to(const diyfp& x, const int target_expon...
type boundaries (line 11073) | struct boundaries
function boundaries (line 11087) | boundaries compute_boundaries(FloatType value)
type cached_power (line 11212) | struct cached_power // c = f * 2^e ~= 10^k
function cached_power (line 11226) | inline cached_power get_cached_power_for_binary_exponent(int e)
function find_largest_pow10 (line 11390) | inline int find_largest_pow10(const std::uint32_t n, std::uint32_t...
function grisu2_round (line 11446) | inline void grisu2_round(char* buf, int len, std::uint64_t dist, s...
function grisu2_digit_gen (line 11487) | inline void grisu2_digit_gen(char* buffer, int& length, int& decim...
function grisu2 (line 11727) | inline void grisu2(char* buf, int& len, int& decimal_exponent,
function grisu2 (line 11786) | void grisu2(char* buf, int& len, int& decimal_exponent, FloatType ...
type error_handler_t (line 12027) | enum class error_handler_t
class serializer (line 12035) | class serializer
method serializer (line 12050) | serializer(output_adapter_t<char> s, const char ichar,
method serializer (line 12062) | serializer(const serializer&) = delete;
method serializer (line 12063) | serializer& operator=(const serializer&) = delete;
method serializer (line 12064) | serializer(serializer&&) = delete;
method serializer (line 12065) | serializer& operator=(serializer&&) = delete;
method dump (line 12085) | void dump(const BasicJsonType& val, const bool pretty_print,
method dump_escaped (line 12295) | void dump_escaped(const string_t& s, const bool ensure_ascii)
method count_digits (line 12551) | inline unsigned int count_digits(number_unsigned_t x) noexcept
method dump_integer (line 12590) | void dump_integer(NumberType x)
method dump_float (line 12676) | void dump_float(number_float_t x)
method dump_float (line 12697) | void dump_float(number_float_t x, std::true_type /*is_ieee_single_...
method dump_float (line 12705) | vo
Copy disabled (too large)
Download .json
Condensed preview — 3640 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (50,189K chars).
[
{
"path": ".bazelignore",
"chars": 399,
"preview": "# The bazel example is an entirely separate bazel module and should\n# not be built as part of the main library module.\ne"
},
{
"path": ".bazelversion",
"chars": 6,
"preview": "8.5.1\n"
},
{
"path": ".clang-format",
"chars": 2492,
"preview": "---\nLanguage: Cpp\nBasedOnStyle: Google\nAccessModifierOffset: -1\nAlignAfterOpenBracket: Align\nAlignConsecutiveAss"
},
{
"path": ".gitattributes",
"chars": 302,
"preview": "* text=auto\n\n*.py text\n*.cpp text\n*.c text\n*.h text\n*.jsonnet text\n*.jinja text\n*.html text\nREADME text\n*.TEMPLATE text\n"
},
{
"path": ".github/workflows/build_and_test.yml",
"chars": 3907,
"preview": "name: Build and Test\n\non:\n pull_request:\n types: [opened, reopened, synchronize, ready_for_review, review_requested]"
},
{
"path": ".github/workflows/create_archive.sh",
"chars": 1841,
"preview": "#!/usr/bin/env bash\n# Copyright 2023 The Bazel Authors. All rights reserved.\n#\n# Licensed under the Apache License, Vers"
},
{
"path": ".github/workflows/doc_update.yml",
"chars": 10315,
"preview": "name: Rebuild Docs\n\non:\n pull_request:\n types: [opened, reopened, synchronize, ready_for_review, review_requested]\n "
},
{
"path": ".github/workflows/publish-python.yml",
"chars": 3357,
"preview": "name: Build and Publish Python Package\n\n# Be very careful granting extra permissions here, as this workflow uses third p"
},
{
"path": ".github/workflows/release.yml",
"chars": 1537,
"preview": "# Copyright 2023 The Bazel Authors. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Licens"
},
{
"path": ".gitignore",
"chars": 864,
"preview": "**/core\n!core/\n\n**/*~\n**/*.pyc\n**/.*.swp\n**/.*.swo\n**/*.o\n**/*.a\n**/*.dylib\n*.dSYM\n.makebuild/\n\njsonnet\njsonnetfmt\n_json"
},
{
"path": "CMakeLists.txt",
"chars": 15750,
"preview": "cmake_minimum_required(VERSION 3.15...4.1)\n\n#### Check important configuration pre-requisites.\n#\n\n# Discourage in-source"
},
{
"path": "CONTRIBUTING",
"chars": 281,
"preview": "Before we can merge your pull request, we need you to sign either the Google individual or corporate\ncontributor license"
},
{
"path": "Dockerfile",
"chars": 332,
"preview": "FROM alpine:latest AS builder\n\nRUN apk -U add build-base\n\nWORKDIR /opt\n\nCOPY . /opt/jsonnet\n\nRUN cd jsonnet && \\\n mak"
},
{
"path": "LICENSE",
"chars": 11358,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "MANIFEST.in",
"chars": 310,
"preview": "include LICENSE include/*.h core/*.cpp core/*.h python/*.c stdlib/std.jsonnet Makefile\nrecursive-include third_party/jso"
},
{
"path": "MODULE.bazel",
"chars": 229,
"preview": "module(name = \"jsonnet\")\n\nbazel_dep(name = \"googletest\", version = \"1.16.0\")\nbazel_dep(name = \"rules_python\", version = "
},
{
"path": "PYTHON_README.md",
"chars": 3640,
"preview": "# Jsonnet - The data templating language\n\nFor an introduction to Jsonnet and documentation,\n[visit our website](https://"
},
{
"path": "README.md",
"chars": 4450,
"preview": "# Jsonnet - The data templating language\n\n;\nyou "
},
{
"path": "benchmarks/bench.02.jsonnet",
"chars": 735,
"preview": "/*\nCopyright 2015 Google Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou "
},
{
"path": "benchmarks/bench.03.jsonnet",
"chars": 687,
"preview": "/*\nCopyright 2015 Google Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou "
},
{
"path": "benchmarks/bench.04.jsonnet",
"chars": 83,
"preview": "std.foldl(function(e, res) e + res, std.makeArray(20000, function(i) 'aaaaa'), '')\n"
},
{
"path": "benchmarks/bench.06.jsonnet",
"chars": 520,
"preview": "// A benchmark for builtin sort\n\nlocal reverse = std.reverse;\nlocal sort = std.sort;\n\ntrue\n&& std.assertEqual(std.range("
},
{
"path": "benchmarks/bench.07.jsonnet",
"chars": 157,
"preview": "local f2(f) = function(x) f(f(x));\nlocal id(x) = x;\n\nlocal slowId = std.makeArray(20, function(i) if i == 0 then id else"
},
{
"path": "benchmarks/bench.08.jsonnet",
"chars": 152,
"preview": "local fibnext = {\n a: super.a + super.b,\n b: super.a,\n};\nlocal fib(n) =\n if n == 0 then\n { a: 1, b: 1 }\n else\n "
},
{
"path": "benchmarks/bench.09.jsonnet",
"chars": 346,
"preview": "// This string must be longer than max stack frames\nlocal veryLongString = std.join('', std.repeat(['e'], 510));\n\nstd.as"
},
{
"path": "benchmarks/gen_big_object.jsonnet",
"chars": 505,
"preview": "local n = 2000;\n\nlocal objLocal(name, body) = 'local ' + name + ' = ' + body + ',';\nlocal objField(name, body) = name + "
},
{
"path": "benchmarks/regen_benchmarks.sh",
"chars": 153,
"preview": "#!/usr/bin/env bash\n\nset -e\nset -x\n\n../jsonnet -S gen_big_object.jsonnet > bench.05.gen.jsonnet\n\nfor i in *.gen.jsonnet;"
},
{
"path": "case_studies/fractal/.gitignore",
"chars": 155,
"preview": "*.packer.log\n*.packer.done\n*.packer.json\nterraform.done\nterraform.plan\nservice.list\n*.tf\nservice_account_key.json\ntilege"
},
{
"path": "case_studies/fractal/appserv/main.py",
"chars": 5289,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "case_studies/fractal/appserv/static/style.css",
"chars": 2342,
"preview": "html {\n height: 100%;\n}\n\nbody {\n font-family: sans-serif;\n height: 100%;\n margin: 0;\n padding: 0;\n bac"
},
{
"path": "case_studies/fractal/appserv/templates/base.html",
"chars": 659,
"preview": "<!doctype html public \"-//w3c//dtd xhtml 1.0 strict//en\"\n\"http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd\">\n<html>\n\n<h"
},
{
"path": "case_studies/fractal/appserv/templates/error.html",
"chars": 153,
"preview": "{% extends \"base.html\" %}\n\n{% block page %}\n\n <div id=err_box>\n <h1>ERROR: {{ code }}</h1>\n <p>{{ msg }"
},
{
"path": "case_studies/fractal/appserv/templates/page.html",
"chars": 7129,
"preview": "{% extends 'base.html' %}\n\n{% block instructions %}\n\nThe <a href=\"https://en.wikipedia.org/wiki/Mandelbrot_set\">Mandelbr"
},
{
"path": "case_studies/fractal/credentials.libsonnet.TEMPLATE",
"chars": 371,
"preview": "{\n project: \"XXXXXXXX\", // GCP project name (e.g. verbing-noun-123)\n cassandraUserPass: \"XXXXXXXX\", // Any valid"
},
{
"path": "case_studies/fractal/lib/cassandra.libsonnet",
"chars": 9332,
"preview": "/*\nCopyright 2015 Google Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou "
},
{
"path": "case_studies/fractal/lib/packer.libsonnet",
"chars": 13572,
"preview": "/*\nCopyright 2015 Google Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou "
},
{
"path": "case_studies/fractal/lib/terraform.libsonnet",
"chars": 2412,
"preview": "/*\nCopyright 2015 Google Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou "
},
{
"path": "case_studies/fractal/service.jsonnet",
"chars": 16170,
"preview": "/*\nCopyright 2015 Google Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou "
},
{
"path": "case_studies/fractal/tilegen/mandelbrot.cpp",
"chars": 4431,
"preview": "/*\nCopyright 2015 Google Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou "
},
{
"path": "case_studies/fractal/tilegen/mandelbrot_service.py",
"chars": 3209,
"preview": "#!/usr/bin/python\n\n# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "case_studies/kubernetes/README.md",
"chars": 354,
"preview": "# Kubernetes Example\n\nThis Kubernetes example is based on https://github.com/vasanthbala/hackathon/tree/master/kbp/redis"
},
{
"path": "case_studies/kubernetes/bigquery-controller.old.yaml",
"chars": 732,
"preview": "apiVersion: v1\nkind: ReplicationController\nmetadata:\n name: bigquery-controller\n labels:\n name: bigquery-controller"
},
{
"path": "case_studies/kubernetes/example.jsonnet",
"chars": 5028,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "case_studies/kubernetes/kube.libsonnet",
"chars": 1373,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "case_studies/kubernetes/redis-master-service.old.yaml",
"chars": 366,
"preview": "apiVersion: v1\nkind: Service\nmetadata:\n name: redismaster\n labels:\n name: redis-master\nspec:\n ports:\n # The por"
},
{
"path": "case_studies/kubernetes/redis-master.old.yaml",
"chars": 408,
"preview": "apiVersion: v1\nkind: ReplicationController\nmetadata:\n name: redis-master\n labels:\n name: redis-master\nspec:\n repli"
},
{
"path": "case_studies/kubernetes/test_same.py",
"chars": 2333,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "case_studies/kubernetes/twitter-stream.old.yaml",
"chars": 810,
"preview": "apiVersion: v1\nkind: ReplicationController\nmetadata:\n name: twitter-stream\n labels:\n name: twitter-stream\nspec:\n r"
},
{
"path": "case_studies/micro_fractal/.gitignore",
"chars": 49,
"preview": "dev_service_account_key.json\nfractal_dev.jsonnet\n"
},
{
"path": "case_studies/micro_fractal/appserv/main.py",
"chars": 5303,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "case_studies/micro_fractal/appserv/static/style.css",
"chars": 2342,
"preview": "html {\n height: 100%;\n}\n\nbody {\n font-family: sans-serif;\n height: 100%;\n margin: 0;\n padding: 0;\n bac"
},
{
"path": "case_studies/micro_fractal/appserv/templates/base.html",
"chars": 659,
"preview": "<!doctype html public \"-//w3c//dtd xhtml 1.0 strict//en\"\n\"http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd\">\n<html>\n\n<h"
},
{
"path": "case_studies/micro_fractal/appserv/templates/error.html",
"chars": 153,
"preview": "{% extends \"base.html\" %}\n\n{% block page %}\n\n <div id=err_box>\n <h1>ERROR: {{ code }}</h1>\n <p>{{ msg }"
},
{
"path": "case_studies/micro_fractal/appserv/templates/page.html",
"chars": 7136,
"preview": "{% extends 'base.html' %}\n\n{% block instructions %}\n\nThe <a href=\"https://en.wikipedia.org/wiki/Mandelbrot_set\">Mandelbr"
},
{
"path": "case_studies/micro_fractal/db/db_export.sh",
"chars": 452,
"preview": "#!/usr/bin/env bash\n\nif [ $# != 1 ] ; then\n echo \"Usage: $0 <db-hostname>\"\n exit 1\nfi\n\nDB_HOSTNAME=$1\n\nCASSANDRA_U"
},
{
"path": "case_studies/micro_fractal/db/db_import.sh",
"chars": 450,
"preview": "#!/usr/bin/env bash\n\nif [ $# != 1 ] ; then\n echo \"Usage: $0 <db-hostname>\"\n exit 1\nfi\n\nDB_HOSTNAME=$1\n\nCASSANDRA_U"
},
{
"path": "case_studies/micro_fractal/db/nodetool.sh",
"chars": 183,
"preview": "#!/usr/bin/env bash\n\nif [ $# == 0 ] ; then\n echo \"Usage: $0 <db-hostname> ...\"\n exit 1\nfi\n\nDB_HOSTNAME=$1\n\nshift\n\n"
},
{
"path": "case_studies/micro_fractal/fractal.jsonnet",
"chars": 7931,
"preview": "local cmd = import 'mmlib/v0.1.2/cmd/cmd.libsonnet';\nlocal cassandra = import 'mmlib/v0.1.2/db/cassandra.libsonnet';\nloc"
},
{
"path": "case_studies/micro_fractal/fractal_dev.jsonnet.TEMPLATE",
"chars": 1030,
"preview": "local service_google = import \"mmlib/v0.1.2/service/google.libsonnet\";\n\nlocal fractal = import \"fractal.jsonnet\";\n\n{\n "
},
{
"path": "case_studies/micro_fractal/tilegen/mandelbrot.cpp",
"chars": 4432,
"preview": "/*\nCopyright 2015 Google Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou "
},
{
"path": "case_studies/micro_fractal/tilegen/mandelbrot_service.py",
"chars": 3965,
"preview": "#!/usr/bin/python\n\n# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "case_studies/micromanage/.gitignore",
"chars": 82,
"preview": "tests/testenv.libsonnet\nexamples/test_google.jsonnet\nexamples/test_amazon.jsonnet\n"
},
{
"path": "case_studies/micromanage/build_artefact.py",
"chars": 1422,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "case_studies/micromanage/cmds.py",
"chars": 2825,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "case_studies/micromanage/examples/hello_world_amazon.jsonnet",
"chars": 3696,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "case_studies/micromanage/examples/hello_world_google.jsonnet",
"chars": 4046,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "case_studies/micromanage/lib/mmlib/v0.1.2/amis/debian.libsonnet",
"chars": 646,
"preview": "// Connect to machines using the username \"admin\" and -i yourkey.pem\n\n// Source: https://wiki.debian.org/Cloud/AmazonEC2"
},
{
"path": "case_studies/micromanage/lib/mmlib/v0.1.2/amis/ubuntu.libsonnet",
"chars": 1226,
"preview": "// Connect to machines using the username \"ubuntu\" and -i yourkey.pem\n\n// Source: https://cloud-images.ubuntu.com/locato"
},
{
"path": "case_studies/micromanage/lib/mmlib/v0.1.2/amis/ubuntu_raw.json",
"chars": 188353,
"preview": "{ \"aaData\":\n[\n[\"ap-northeast-1\",\"karmic\",\"9.10 EOL\",\"amd64\",\"instance-store\",\"20100826\",\"<a href=\\\"https://console.aws.a"
},
{
"path": "case_studies/micromanage/lib/mmlib/v0.1.2/cmd/apt.libsonnet",
"chars": 1660,
"preview": "local pip = import 'pip.libsonnet';\n\n{\n local libos = self,\n\n // A mixin on top of an image or instance that allows hi"
},
{
"path": "case_studies/micromanage/lib/mmlib/v0.1.2/cmd/cmd.libsonnet",
"chars": 668,
"preview": "{\n local HasPermissions = {\n owner: 'root',\n group: self.owner,\n },\n local FilePermissions = {\n filePermissi"
},
{
"path": "case_studies/micromanage/lib/mmlib/v0.1.2/cmd/pip.libsonnet",
"chars": 314,
"preview": "{\n // A mixin on top of an image or instance that allows high level installation of pip packages.\n Mixin:: {\n\n // A"
},
{
"path": "case_studies/micromanage/lib/mmlib/v0.1.2/db/cassandra.libsonnet",
"chars": 15093,
"preview": "local service_google = import '../service/google.libsonnet';\n\n// TODO(dcunnin): Separate into 5 mixins:\n// 1) mixins tha"
},
{
"path": "case_studies/micromanage/lib/mmlib/v0.1.2/service/amazon.libsonnet",
"chars": 8102,
"preview": "local amis_debian = import '../amis/debian.libsonnet';\nlocal apt = import '../cmd/apt.libsonnet';\nlocal cmd = import '.."
},
{
"path": "case_studies/micromanage/lib/mmlib/v0.1.2/service/base.libsonnet",
"chars": 1432,
"preview": "{\n\n // The base class of all Micromanage services. While it is not necessary to use this, it does\n // provide the fol"
},
{
"path": "case_studies/micromanage/lib/mmlib/v0.1.2/service/google.libsonnet",
"chars": 18296,
"preview": "local apt = import '../cmd/apt.libsonnet';\nlocal cmd = import '../cmd/cmd.libsonnet';\nlocal base = import 'base.libsonne"
},
{
"path": "case_studies/micromanage/lib/mmlib/v0.1.2/web/nginx.libsonnet",
"chars": 2260,
"preview": "local cmd = import '../cmd/cmd.libsonnet';\n\n{\n // A mixin on top of a Debian instance that manages an Nginx installatio"
},
{
"path": "case_studies/micromanage/lib/mmlib/v0.1.2/web/solutions.libsonnet",
"chars": 794,
"preview": "local nginx = import 'nginx.libsonnet';\nlocal uwsgi_flask = import 'uwsgi_flask.libsonnet';\n\n{\n /** A mixin on top of a"
},
{
"path": "case_studies/micromanage/lib/mmlib/v0.1.2/web/uwsgi_flask.libsonnet",
"chars": 3957,
"preview": "local cmd = import '../cmd/cmd.libsonnet';\n\n{\n // A Debian instance mixin that manages Flash and Uwsgi for the purposes"
},
{
"path": "case_studies/micromanage/lib/mmlib/v0.1.2/web/web.libsonnet",
"chars": 2855,
"preview": "{\n // A mixin on top of an InstanceBasedService that turns it into an HTTP and/or HTTPs service.\n // This is only real"
},
{
"path": "case_studies/micromanage/micromanage",
"chars": 688,
"preview": "#!/usr/bin/env bash\n\n# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2."
},
{
"path": "case_studies/micromanage/micromanage.py",
"chars": 21246,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "case_studies/micromanage/packer.py",
"chars": 4792,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "case_studies/micromanage/service.py",
"chars": 4417,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "case_studies/micromanage/service_amazon.py",
"chars": 7418,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "case_studies/micromanage/service_google.py",
"chars": 9395,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "case_studies/micromanage/tests/amazon/test_single_instance.jsonnet",
"chars": 3515,
"preview": "local cmd = import \"mmlib/v0.1.2/cmd/cmd.libsonnet\";\nlocal amis_ubuntu = import \"mmlib/v0.1.2/amis/ubuntu.libsonnet\";\nlo"
},
{
"path": "case_studies/micromanage/tests/google/test_empty.jsonnet",
"chars": 113,
"preview": "{\n environments: import \"../testenv.libsonnet\",\n\n empty_service: {\n environment: \"google\",\n },\n}\n"
},
{
"path": "case_studies/micromanage/tests/google/test_nested.jsonnet",
"chars": 1807,
"preview": "{\n environments: import \"../testenv.libsonnet\",\n\n local SingleInstance(name) = {\n local service = self,\n\n "
},
{
"path": "case_studies/micromanage/tests/google/test_single_instance.jsonnet",
"chars": 2569,
"preview": "local cmd = import \"mmlib/v0.1.2/cmd/cmd.libsonnet\";\n\n{\n environments: import \"../testenv.libsonnet\",\n\n local Sing"
},
{
"path": "case_studies/micromanage/tests/test_really_empty.jsonnet",
"chars": 31,
"preview": "{\n environments: {\n },\n}\n"
},
{
"path": "case_studies/micromanage/tests/testenv.libsonnet.TEMPLATE",
"chars": 1063,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "case_studies/micromanage/util.py",
"chars": 1099,
"preview": "\n# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n#"
},
{
"path": "case_studies/micromanage/validate.py",
"chars": 4805,
"preview": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# "
},
{
"path": "cmd/BUILD",
"chars": 615,
"preview": "load(\"@rules_cc//cc:cc_binary.bzl\", \"cc_binary\")\nload(\"@rules_cc//cc:cc_library.bzl\", \"cc_library\")\n\npackage(default_vis"
},
{
"path": "cmd/jsonnet.cpp",
"chars": 22009,
"preview": "/*\nCopyright 2015 Google Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou "
},
{
"path": "cmd/jsonnetfmt.cpp",
"chars": 12547,
"preview": "/*\nCopyright 2019 Google Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou "
},
{
"path": "cmd/utils.cpp",
"chars": 4032,
"preview": "/*\nCopyright 2019 Google Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou "
},
{
"path": "cmd/utils.h",
"chars": 1762,
"preview": "/*\nCopyright 2019 Google Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou "
},
{
"path": "cpp/BUILD",
"chars": 750,
"preview": "load(\"@rules_cc//cc:cc_library.bzl\", \"cc_library\")\nload(\"@rules_cc//cc:cc_test.bzl\", \"cc_test\")\n\npackage(default_visibil"
},
{
"path": "cpp/libjsonnet++.cpp",
"chars": 5045,
"preview": "/*\nCopyright 2015 Google Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou "
},
{
"path": "cpp/libjsonnet++_test.cpp",
"chars": 3694,
"preview": "/*\nCopyright 2015 Google Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou "
},
{
"path": "cpp/libjsonnet_locale_test.cpp",
"chars": 1713,
"preview": "#include <iostream>\n#include <sstream>\n#include <locale>\n#include <cassert>\n#include <libjsonnet++.h>\n#include \"gtest/gt"
},
{
"path": "cpp/testdata/BUILD",
"chars": 771,
"preview": "load(\"//tools/build_defs:golden_test.bzl\", \"jsonnet_json_golden_test\")\n\npackage(default_visibility = [\"//visibility:publ"
},
{
"path": "cpp/testdata/example.jsonnet",
"chars": 691,
"preview": "// Copyright 2016 Google Inc. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
},
{
"path": "cpp/testdata/example_golden.json",
"chars": 14,
"preview": "{\n \"z\": 2\n}\n"
},
{
"path": "cpp/testdata/importing.jsonnet",
"chars": 671,
"preview": "// Copyright 2016 Google Inc. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
},
{
"path": "cpp/testdata/importing_golden.json",
"chars": 14,
"preview": "{\n \"z\": 2\n}\n"
},
{
"path": "cpp/testdata/invalid.jsonnet",
"chars": 622,
"preview": "// Copyright 2016 Google Inc. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");"
},
{
"path": "cpp/testdata/invalid.out",
"chars": 59,
"preview": "RUNTIME ERROR: Foo.\n\tcpp/testdata/invalid.jsonnet:15:1-13\t\n"
},
{
"path": "doc/.gitignore",
"chars": 26,
"preview": "production\n.jekyll-cache/\n"
},
{
"path": "doc/CNAME",
"chars": 12,
"preview": "jsonnet.org\n"
},
{
"path": "doc/_config.yml",
"chars": 90,
"preview": "destination: production\nmarkdown: kramdown\nhighlighter: pygments\nexclude: ['_stdlib_gen']\n"
},
{
"path": "doc/_includes/demo.inc",
"chars": 1050,
"preview": "<div class=\"inverse hgroup\">\n <div class=hgroup-inline>\n <div class=\"tab-window-input\" id=\"{{ include.name }}-input\""
},
{
"path": "doc/_includes/examples/arith.jsonnet",
"chars": 932,
"preview": "{\n concat_array: [1, 2, 3] + [4],\n concat_string: '123' + 4,\n equality1: 1 == '1',\n equality2: [{}, { x: 3 - 1 }]\n "
},
{
"path": "doc/_includes/examples/arith.jsonnet.golden",
"chars": 463,
"preview": "{\n \"concat_array\": [\n 1,\n 2,\n 3,\n 4\n ],\n \"concat_string\": \"1234\",\n \"equality1\": false,\n \"equality2\": tr"
},
{
"path": "doc/_includes/examples/cocktail-comprehensions.jsonnet",
"chars": 729,
"preview": "{\n cocktails: {\n \"Bee's Knees\": {\n // Construct the ingredients by using\n // 4/3 oz of each element in the"
},
{
"path": "doc/_includes/examples/cocktail-comprehensions.jsonnet.golden",
"chars": 884,
"preview": "{\n \"cocktails\": {\n \"Bee's Knees\": {\n \"garnish\": \"Lemon Twist\",\n \"ingredients\": [\n {\n \"kind"
},
{
"path": "doc/_includes/examples/comprehensions.jsonnet",
"chars": 625,
"preview": "local arr = std.range(5, 8);\n{\n array_comprehensions: {\n higher: [x + 3 for x in arr],\n lower: [x - 3 for x in ar"
},
{
"path": "doc/_includes/examples/comprehensions.jsonnet.golden",
"chars": 494,
"preview": "{\n \"array_comprehensions\": {\n \"evens\": [\n 6,\n 8\n ],\n \"evens_and_odds\": [\n \"6-5\",\n \"6-7\",\n "
},
{
"path": "doc/_includes/examples/computed-fields.jsonnet",
"chars": 272,
"preview": "local Margarita(salted) = {\n ingredients: [\n { kind: 'Tequila Blanco', qty: 2 },\n { kind: 'Lime', qty: 1 },\n {"
},
{
"path": "doc/_includes/examples/computed-fields.jsonnet.golden",
"chars": 509,
"preview": "{\n \"Margarita\": {\n \"garnish\": \"Salt\",\n \"ingredients\": [\n {\n \"kind\": \"Tequila Blanco\",\n \"qty\": "
},
{
"path": "doc/_includes/examples/conditionals.jsonnet",
"chars": 774,
"preview": "local Mojito(virgin=false, large=false) = {\n // A local next to fields ends with ','.\n local factor = if large then 2 "
},
{
"path": "doc/_includes/examples/conditionals.jsonnet.golden",
"chars": 1341,
"preview": "{\n \"Large Mojito\": {\n \"garnish\": \"Lime wedge\",\n \"ingredients\": [\n {\n \"action\": \"muddle\",\n \"kin"
},
{
"path": "doc/_includes/examples/error-examples.jsonnet",
"chars": 583,
"preview": "// Extend above example to sanity check input.\nlocal equal_parts(size, ingredients) =\n local qty = size / std.length(in"
},
{
"path": "doc/_includes/examples/error-examples.jsonnet.golden",
"chars": 129,
"preview": "{\n \"object\": {\n \"f\": 1,\n \"g\": 2\n },\n \"test1\": [\n {\n \"kind\": \"Whiskey\",\n \"qty\": 1\n }\n ],\n \"tes"
},
{
"path": "doc/_includes/examples/functions.jsonnet",
"chars": 1020,
"preview": "// Define a local function.\n// Default arguments are like Python:\nlocal my_function(x, y=10) = x + y;\n\n// Define a local"
},
{
"path": "doc/_includes/examples/functions.jsonnet.golden",
"chars": 207,
"preview": "{\n \"call\": 12,\n \"call_inline_function\": 25,\n \"call_method1\": 9,\n \"call_multiline_function\": [8, 9],\n \"len\": [\n 5"
},
{
"path": "doc/_includes/examples/garnish.txt",
"chars": 17,
"preview": "Maraschino Cherry"
},
{
"path": "doc/_includes/examples/imports.jsonnet",
"chars": 329,
"preview": "local martinis = import 'martinis.libsonnet';\n\n{\n 'Vodka Martini': martinis['Vodka Martini'],\n Manhattan: {\n ingred"
},
{
"path": "doc/_includes/examples/imports.jsonnet.golden",
"chars": 551,
"preview": "{\n \"Manhattan\": {\n \"garnish\": \"Maraschino Cherry\",\n \"ingredients\": [\n {\n \"kind\": \"Rye\",\n \"qty\""
},
{
"path": "doc/_includes/examples/inner-reference.jsonnet",
"chars": 253,
"preview": "{\n Martini: {\n local drink = self,\n ingredients: [\n { kind: \"Farmer's Gin\", qty: 1 },\n {\n kind: "
},
{
"path": "doc/_includes/examples/inner-reference.jsonnet.golden",
"chars": 240,
"preview": "{\n \"Martini\": {\n \"garnish\": \"Olive\",\n \"ingredients\": [\n {\n \"kind\": \"Farmer's Gin\",\n \"qty\": 1\n "
},
{
"path": "doc/_includes/examples/library-ext.libsonnet",
"chars": 264,
"preview": "local fizz = if std.extVar('brunch') then\n 'Cheap Sparkling Wine'\nelse\n 'Champagne';\n{\n Mimosa: {\n ingredients: [\n"
},
{
"path": "doc/_includes/examples/library-tla.libsonnet",
"chars": 328,
"preview": "{\n // Note that the Mimosa is now\n // parameterized.\n Mimosa(brunch): {\n local fizz = if brunch then\n 'Cheap "
},
{
"path": "doc/_includes/examples/martinis.libsonnet",
"chars": 447,
"preview": "{\n 'Vodka Martini': {\n ingredients: [\n { kind: 'Vodka', qty: 2 },\n { kind: 'Dry White Vermouth', qty: 1 },"
},
{
"path": "doc/_includes/examples/mixins.jsonnet",
"chars": 965,
"preview": "local sours = import 'sours-oo.jsonnet';\n\nlocal RemoveGarnish = {\n // Not technically removed, but made hidden.\n garni"
},
{
"path": "doc/_includes/examples/mixins.jsonnet.golden",
"chars": 1119,
"preview": "{\n \"Virgin Daiquiri\": {\n \"garnish\": \"Lime wedge\",\n \"ingredients\": [\n {\n \"kind\": \"Water\",\n \"qty"
},
{
"path": "doc/_includes/examples/negroni.jsonnet",
"chars": 275,
"preview": "local utils = import 'utils.libsonnet';\n{\n Negroni: {\n // Divide 3oz among the 3 ingredients.\n ingredients: utils"
},
{
"path": "doc/_includes/examples/negroni.jsonnet.golden",
"chars": 307,
"preview": "{\n \"Negroni\": {\n \"garnish\": \"Orange Peel\",\n \"ingredients\": [\n {\n \"kind\": \"Farmers Gin\",\n \"qty\""
},
{
"path": "doc/_includes/examples/oo-contrived.jsonnet",
"chars": 225,
"preview": "local Base = {\n f: 2,\n g: self.f + 100,\n};\n\nlocal WrapperBase = {\n Base: Base,\n};\n\n{\n Derived: Base + {\n f: 5,\n "
},
{
"path": "doc/_includes/examples/oo-contrived.jsonnet.golden",
"chars": 158,
"preview": "{\n \"Derived\": {\n \"f\": 5,\n \"g\": 105,\n \"old_f\": 2,\n \"old_g\": 105\n },\n \"WrapperDerived\": {\n \"Base\": {\n "
},
{
"path": "doc/_includes/examples/references.jsonnet",
"chars": 634,
"preview": "{\n 'Tom Collins': {\n ingredients: [\n { kind: \"Farmer's Gin\", qty: 1.5 },\n { kind: 'Lemon', qty: 1 },\n "
},
{
"path": "doc/_includes/examples/references.jsonnet.golden",
"chars": 910,
"preview": "{\n \"Gin Martini\": {\n \"garnish\": \"Olive\",\n \"ingredients\": [\n {\n \"kind\": \"Farmer's Gin\",\n \"qty\":"
},
{
"path": "doc/_includes/examples/sours-oo.jsonnet",
"chars": 769,
"preview": "local templates = import 'templates.libsonnet';\n\n{\n // The template requires us to override\n // the 'spirit'.\n 'Whisk"
},
{
"path": "doc/_includes/examples/sours-oo.jsonnet.golden",
"chars": 1277,
"preview": "{\n \"Daiquiri\": {\n \"garnish\": \"Lime wedge\",\n \"ingredients\": [\n {\n \"kind\": \"Banks 7 Rum\",\n \"qty\""
},
{
"path": "doc/_includes/examples/sours.jsonnet",
"chars": 590,
"preview": "// This function returns an object. Although\n// the braces look like Java or C++ they do\n// not mean a statement block, "
},
{
"path": "doc/_includes/examples/sours.jsonnet.golden",
"chars": 752,
"preview": "{\n \"Pisco Sour\": {\n \"garnish\": \"Angostura bitters\",\n \"ingredients\": [\n {\n \"kind\": \"Machu Pisco\",\n "
},
{
"path": "doc/_includes/examples/syntax.jsonnet",
"chars": 853,
"preview": "/* A C-style comment. */\n# A Python-style comment.\n{\n cocktails: {\n // Ingredient quantities are in fl oz.\n 'Tom "
},
{
"path": "doc/_includes/examples/syntax.jsonnet.golden",
"chars": 1004,
"preview": "{\n \"cocktails\": {\n \"Manhattan\": {\n \"description\": \"A clear \\\\ red drink.\",\n \"garnish\": \"Maraschino Cherry\""
},
{
"path": "doc/_includes/examples/templates.libsonnet",
"chars": 592,
"preview": "{\n // Abstract template of a \"sour\" cocktail.\n Sour: {\n local drink = self,\n\n // Hidden fields can be referred t"
},
{
"path": "doc/_includes/examples/top-level-ext.jsonnet",
"chars": 752,
"preview": "local lib = import 'library-ext.libsonnet';\n{\n [std.extVar('prefix') + 'Pina Colada']: {\n ingredients: [\n { kin"
},
{
"path": "doc/_includes/examples/top-level-ext.jsonnet.golden",
"chars": 1090,
"preview": "{\n \"Happy Hour Bloody Mary\": {\n \"garnish\": \"Celery salt & pepper\",\n \"ingredients\": [\n {\n \"kind\": \"Vod"
},
{
"path": "doc/_includes/examples/top-level-tla.jsonnet",
"chars": 801,
"preview": "local lib = import 'library-tla.libsonnet';\n\n// Here is the top-level function, note brunch\n// now has a default value.\n"
},
{
"path": "doc/_includes/examples/top-level-tla.jsonnet.golden",
"chars": 1090,
"preview": "{\n \"Happy Hour Bloody Mary\": {\n \"garnish\": \"Celery salt & pepper\",\n \"ingredients\": [\n {\n \"kind\": \"Vod"
},
{
"path": "doc/_includes/examples/utils.libsonnet",
"chars": 221,
"preview": "{\n equal_parts(size, ingredients)::\n // Define a function-scoped variable.\n local qty = size / std.length(ingredi"
},
{
"path": "doc/_includes/examples/variables.jsonnet",
"chars": 653,
"preview": "// A regular definition.\nlocal house_rum = 'Banks Rum';\n\n{\n // A definition next to fields.\n local pour = 1.5,\n\n Daiq"
},
{
"path": "doc/_includes/examples/variables.jsonnet.golden",
"chars": 741,
"preview": "{\n \"Daiquiri\": {\n \"ingredients\": [\n {\n \"kind\": \"Banks Rum\",\n \"qty\": 1.5\n },\n {\n "
},
{
"path": "doc/_layouts/base.html",
"chars": 6308,
"preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmln"
},
{
"path": "doc/_layouts/default.html",
"chars": 55,
"preview": "---\nlayout: base\nviewport_width: 576\n---\n{{ content }}\n"
},
{
"path": "doc/_layouts/markdown.html",
"chars": 204,
"preview": "---\nlayout: default\n---\n<div class=\"hgroup\">\n <div class=\"hgroup-inline\">\n <div class=\"panel\">\n {{ "
},
{
"path": "doc/_layouts/redirect.html",
"chars": 115,
"preview": "<html>\n <head>\n <script>\n window.location.replace(\"{{ page.redirect }}\");\n </script>\n </head>\n</html>\n"
},
{
"path": "doc/_layouts/stdlib.html",
"chars": 189,
"preview": "---\nlayout: base\nviewport_width: 576\n---\n{{ content }}\n\n<script>\n(function(){\n let funcAnchors = new AnchorJS({\n pla"
},
{
"path": "doc/_layouts/wide.html",
"chars": 56,
"preview": "---\nlayout: base\nviewport_width: 960\n---\n{{ content }}\n\n"
},
{
"path": "doc/_stdlib_gen/html.libsonnet",
"chars": 4616,
"preview": "// A little helper library for building HTML documents with Jsonnet.\n//\n// Parts of the HTML document (elements, comment"
},
{
"path": "doc/_stdlib_gen/jekyll.libsonnet",
"chars": 354,
"preview": "local html = import 'html.libsonnet';\n\nlocal renderWithFrontMatter(params, body) =\n '---\\n' +\n '# AUTOGENERATED FILE. "
},
{
"path": "doc/_stdlib_gen/run_tests.sh",
"chars": 1070,
"preview": "#!/usr/bin/env bash\n\n# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2."
},
{
"path": "doc/_stdlib_gen/stdlib-content-test.jsonnet",
"chars": 435,
"preview": "local stdlib_content = import 'stdlib-content.jsonnet';\n\nstd.all([\n if !std.objectHas(field, 'availableSince') then\n "
},
{
"path": "doc/_stdlib_gen/stdlib-content.jsonnet",
"chars": 65993,
"preview": "local html = import 'html.libsonnet';\n\nlocal exampleDocMultiline(mid, ex) =\n html.spaceless([\n html.p({}, 'Example:'"
},
{
"path": "doc/_stdlib_gen/stdlib.jsonnet",
"chars": 2303,
"preview": "local html = import 'html.libsonnet';\nlocal jekyll = import 'jekyll.libsonnet';\nlocal content = import 'stdlib-content.j"
},
{
"path": "doc/articles/comparisons.html",
"chars": 11486,
"preview": "---\nlayout: default\ntitle: Comparisons\n---\n\n<div class=\"hgroup\">\n <div class=\"hgroup-inline\">\n <div class=\"panel\">\n "
},
{
"path": "doc/articles/design.html",
"chars": 19976,
"preview": "---\nlayout: default\ntitle: Language Design\n---\n\n<div class=\"hgroup\">\n <div class=\"hgroup-inline\">\n <div class=\"panel"
},
{
"path": "doc/articles/fractal.1.html",
"chars": 7857,
"preview": "---\nlayout: default\ntitle: Fractal Application (1/3)\nsrcroot: https://github.com/google/jsonnet/blob/master/case_studies"
},
{
"path": "doc/articles/fractal.2.html",
"chars": 24825,
"preview": "---\nlayout: default\ntitle: Fractal Application (2/3)\nsrcroot: https://github.com/google/jsonnet/blob/master/case_studies"
},
{
"path": "doc/articles/fractal.3.html",
"chars": 13494,
"preview": "---\nlayout: default\ntitle: Fractal Application (3/3)\nservice_jsonnet: https://github.com/google/jsonnet/blob/master/case"
},
{
"path": "doc/articles/kubernetes.html",
"chars": 12952,
"preview": "---\nlayout: default\ntitle: Kubernetes\n---\n\n<div class=\"hgroup\">\n <div class=\"hgroup-inline\">\n <div class=\"panel\">\n "
},
{
"path": "doc/articles/output-formats.html",
"chars": 9917,
"preview": "---\nlayout: default\ntitle: Output Formats\n---\n\n<div class=\"hgroup\">\n <div class=\"hgroup-inline\">\n <div class=\"panel\""
},
{
"path": "doc/case_studies/casestudy_fractal.1.html",
"chars": 60,
"preview": "---\nlayout: redirect\nredirect: /articles/fractal.1.html\n---\n"
},
{
"path": "doc/contributing.html",
"chars": 60,
"preview": "---\nlayout: redirect\nredirect: /learning/community.html\n---\n"
},
{
"path": "doc/css/cellphone-small.css",
"chars": 628,
"preview": "/* Cellphone width. */\n\ndiv#header {\n margin-bottom: 16px;\n}\n\ndiv.panel {\n width: 512px;\n}\ndiv.header2 {\n max-width: "
},
{
"path": "doc/css/cellphone.css",
"chars": 626,
"preview": "/* Cellphone width. */\n\ndiv#header {\n margin-bottom: 32px;\n}\n\ndiv.panel {\n float: top;\n}\ndiv.header2 {\n max-width: 72"
},
{
"path": "doc/css/desktop.css",
"chars": 667,
"preview": "/* Desktop width. */\n\ndiv#header {\n margin-bottom: 40px;\n}\n\ndiv.panel {\n float: left;\n}\ndiv.header2 {\n max-width: 128"
},
{
"path": "doc/css/doc.css",
"chars": 3481,
"preview": "/* Non-responsive style. */\n\nbody {\n font-family: 'Open Sans';\n text-size-adjust: none;\n margin: 0;\n}\n\ndiv#header {\n "
},
{
"path": "doc/docs/index.html",
"chars": 54,
"preview": "---\nlayout: redirect\nredirect: /ref/language.html\n---\n"
},
{
"path": "doc/docs/stdlib.html",
"chars": 52,
"preview": "---\nlayout: redirect\nredirect: /ref/stdlib.html\n---\n"
},
{
"path": "doc/docs/tutorial.html",
"chars": 59,
"preview": "---\nlayout: redirect\nredirect: /learning/tutorial.html\n---\n"
},
{
"path": "doc/index.html",
"chars": 9074,
"preview": "---\nlayout: default\ntitle: Jsonnet Configuration Language\n---\n\n<div class=hgroup>\n <div class=hgroup-inline>\n <div c"
},
{
"path": "doc/js/codemirror-mode-jsonnet.js",
"chars": 6288,
"preview": "/** @license\n *\n * Copyright 2017 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 "
},
{
"path": "doc/js/demo.js",
"chars": 13848,
"preview": "function textarea_content_height(textarea) {\n // This trick only works if display is not 'none'.\n let old_display = te"
},
{
"path": "doc/js/menu.js",
"chars": 988,
"preview": "var menu_timeout = null;\n\nfunction set_visible(menu, b)\n{\n var category = menu.children[0];\n var dropdown = menu.child"
},
{
"path": "doc/js/wasm_exec.js",
"chars": 16687,
"preview": "// Copyright 2018 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license "
},
{
"path": "doc/language/spec.html",
"chars": 50,
"preview": "---\nlayout: redirect\nredirect: /ref/spec.html\n---\n"
},
{
"path": "doc/learning/community.html",
"chars": 2259,
"preview": "---\nlayout: default\ntitle: Community\n---\n\n<div class=\"hgroup\">\n <div class=\"hgroup-inline\">\n <div class=\"panel\">\n "
},
{
"path": "doc/learning/getting_started.html",
"chars": 7992,
"preview": "---\nlayout: default\ntitle: Getting Started\n---\n\n<div class=\"hgroup\">\n <div class=\"hgroup-inline\">\n <div class=\"panel"
},
{
"path": "doc/learning/tools.html",
"chars": 6031,
"preview": "---\nlayout: default\ntitle: Tooling\n---\n\n<div class=\"hgroup\">\n <div class=\"hgroup-inline\">\n <div class=\"panel\">\n "
},
{
"path": "doc/learning/tutorial.html",
"chars": 30639,
"preview": "---\nlayout: default\ntitle: Tutorial\n---\n\n<div class=\"hgroup\">\n <div class=\"hgroup-inline\">\n <div class=\"panel\">\n "
},
{
"path": "doc/ref/bindings.html",
"chars": 9838,
"preview": "---\nlayout: default\ntitle: Bindings\n---\n\n<div class=\"hgroup\">\n <div class=\"hgroup-inline\">\n <div class=\"panel\">\n "
},
{
"path": "doc/ref/language.html.md",
"chars": 30722,
"preview": "---\nlayout: markdown\ntitle: Language Reference\n---\n\n# Language Reference\n\nThis page explains Jsonnet in detail. We assum"
}
]
// ... and 3440 more files (download for full content)
About this extraction
This page contains the full source code of the google/jsonnet GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 3640 files (46.1 MB), approximately 12.3M tokens, and a symbol index with 4474 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.