initial commit

Signed-off-by: Sean Cross <sean@xobs.io>
This commit is contained in:
Sean Cross 2019-06-16 08:39:06 -07:00
commit 4beca5ea3f
121 changed files with 33325 additions and 0 deletions

5
.travis.yml Normal file
View File

@ -0,0 +1,5 @@
language: node_js
node_js:
- 4
after_script:
- npm run build -- retire

23
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,23 @@
## Contributing
Please keep the [issue tracker](http://github.com/hakimel/reveal.js/issues) limited to **bug reports**, **feature requests** and **pull requests**.
### Personal Support
If you have personal support or setup questions the best place to ask those are [StackOverflow](http://stackoverflow.com/questions/tagged/reveal.js).
### Bug Reports
When reporting a bug make sure to include information about which browser and operating system you are on as well as the necessary steps to reproduce the issue. If possible please include a link to a sample presentation where the bug can be tested.
### Pull Requests
- Should follow the coding style of the file you work in, most importantly:
- Tabs to indent
- Single-quoted strings
- Should be made towards the **dev branch**
- Should be submitted from a feature/topic branch (not your master)
### Plugins
Please do not submit plugins as pull requests. They should be maintained in their own separate repository. More information here: https://github.com/hakimel/reveal.js/wiki/Plugin-Guidelines

193
Gruntfile.js Normal file
View File

@ -0,0 +1,193 @@
/* global module:false */
module.exports = function(grunt) {
var port = grunt.option('port') || 8000;
var root = grunt.option('root') || '.';
if (!Array.isArray(root)) root = [root];
// Project configuration
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
meta: {
banner:
'/*!\n' +
' * reveal.js <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' +
' * http://revealjs.com\n' +
' * MIT licensed\n' +
' *\n' +
' * Copyright (C) 2018 Hakim El Hattab, http://hakim.se\n' +
' */'
},
qunit: {
files: [ 'test/*.html' ]
},
uglify: {
options: {
banner: '<%= meta.banner %>\n',
ie8: true
},
build: {
src: 'js/reveal.js',
dest: 'js/reveal.min.js'
}
},
sass: {
core: {
src: 'css/reveal.scss',
dest: 'css/reveal.css'
},
themes: {
expand: true,
cwd: 'css/theme/source',
src: ['*.sass', '*.scss'],
dest: 'css/theme',
ext: '.css'
}
},
autoprefixer: {
core: {
src: 'css/reveal.css'
}
},
cssmin: {
options: {
compatibility: 'ie9'
},
compress: {
src: 'css/reveal.css',
dest: 'css/reveal.min.css'
}
},
jshint: {
options: {
curly: false,
eqeqeq: true,
immed: true,
esnext: true,
latedef: 'nofunc',
newcap: true,
noarg: true,
sub: true,
undef: true,
eqnull: true,
browser: true,
expr: true,
loopfunc: true,
globals: {
head: false,
module: false,
console: false,
unescape: false,
define: false,
exports: false
}
},
files: [ 'Gruntfile.js', 'js/reveal.js' ]
},
connect: {
server: {
options: {
port: port,
base: root,
livereload: true,
open: true,
useAvailablePort: true
}
}
},
zip: {
bundle: {
src: [
'index.html',
'css/**',
'js/**',
'lib/**',
'images/**',
'plugin/**',
'**.md'
],
dest: 'reveal-js-presentation.zip'
}
},
watch: {
js: {
files: [ 'Gruntfile.js', 'js/reveal.js' ],
tasks: 'js'
},
theme: {
files: [
'css/theme/source/*.sass',
'css/theme/source/*.scss',
'css/theme/template/*.sass',
'css/theme/template/*.scss'
],
tasks: 'css-themes'
},
css: {
files: [ 'css/reveal.scss' ],
tasks: 'css-core'
},
html: {
files: root.map(path => path + '/*.html')
},
markdown: {
files: root.map(path => path + '/*.md')
},
options: {
livereload: true
}
},
retire: {
js: [ 'js/reveal.js', 'lib/js/*.js', 'plugin/**/*.js' ],
node: [ '.' ]
}
});
// Dependencies
grunt.loadNpmTasks( 'grunt-contrib-connect' );
grunt.loadNpmTasks( 'grunt-contrib-cssmin' );
grunt.loadNpmTasks( 'grunt-contrib-jshint' );
grunt.loadNpmTasks( 'grunt-contrib-qunit' );
grunt.loadNpmTasks( 'grunt-contrib-uglify' );
grunt.loadNpmTasks( 'grunt-contrib-watch' );
grunt.loadNpmTasks( 'grunt-autoprefixer' );
grunt.loadNpmTasks( 'grunt-retire' );
grunt.loadNpmTasks( 'grunt-sass' );
grunt.loadNpmTasks( 'grunt-zip' );
// Default task
grunt.registerTask( 'default', [ 'css', 'js' ] );
// JS task
grunt.registerTask( 'js', [ 'jshint', 'uglify', 'qunit' ] );
// Theme CSS
grunt.registerTask( 'css-themes', [ 'sass:themes' ] );
// Core framework CSS
grunt.registerTask( 'css-core', [ 'sass:core', 'autoprefixer', 'cssmin' ] );
// All CSS
grunt.registerTask( 'css', [ 'sass', 'autoprefixer', 'cssmin' ] );
// Package presentation to archive
grunt.registerTask( 'package', [ 'default', 'zip' ] );
// Serve presentation locally
grunt.registerTask( 'serve', [ 'connect', 'watch' ] );
// Run tests
grunt.registerTask( 'test', [ 'jshint', 'qunit' ] );
};

19
LICENSE Normal file
View File

@ -0,0 +1,19 @@
Copyright (C) 2018 Hakim El Hattab, http://hakim.se, and reveal.js contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

1315
README.md Normal file

File diff suppressed because it is too large Load Diff

203
css/print/paper.css Normal file
View File

@ -0,0 +1,203 @@
/* Default Print Stylesheet Template
by Rob Glazebrook of CSSnewbie.com
Last Updated: June 4, 2008
Feel free (nay, compelled) to edit, append, and
manipulate this file as you see fit. */
@media print {
/* SECTION 1: Set default width, margin, float, and
background. This prevents elements from extending
beyond the edge of the printed page, and prevents
unnecessary background images from printing */
html {
background: #fff;
width: auto;
height: auto;
overflow: visible;
}
body {
background: #fff;
font-size: 20pt;
width: auto;
height: auto;
border: 0;
margin: 0 5%;
padding: 0;
overflow: visible;
float: none !important;
}
/* SECTION 2: Remove any elements not needed in print.
This would include navigation, ads, sidebars, etc. */
.nestedarrow,
.controls,
.fork-reveal,
.share-reveal,
.state-background,
.reveal .progress,
.reveal .backgrounds,
.reveal .slide-number {
display: none !important;
}
/* SECTION 3: Set body font face, size, and color.
Consider using a serif font for readability. */
body, p, td, li, div {
font-size: 20pt!important;
font-family: Georgia, "Times New Roman", Times, serif !important;
color: #000;
}
/* SECTION 4: Set heading font face, sizes, and color.
Differentiate your headings from your body text.
Perhaps use a large sans-serif for distinction. */
h1,h2,h3,h4,h5,h6 {
color: #000!important;
height: auto;
line-height: normal;
font-family: Georgia, "Times New Roman", Times, serif !important;
text-shadow: 0 0 0 #000 !important;
text-align: left;
letter-spacing: normal;
}
/* Need to reduce the size of the fonts for printing */
h1 { font-size: 28pt !important; }
h2 { font-size: 24pt !important; }
h3 { font-size: 22pt !important; }
h4 { font-size: 22pt !important; font-variant: small-caps; }
h5 { font-size: 21pt !important; }
h6 { font-size: 20pt !important; font-style: italic; }
/* SECTION 5: Make hyperlinks more usable.
Ensure links are underlined, and consider appending
the URL to the end of the link for usability. */
a:link,
a:visited {
color: #000 !important;
font-weight: bold;
text-decoration: underline;
}
/*
.reveal a:link:after,
.reveal a:visited:after {
content: " (" attr(href) ") ";
color: #222 !important;
font-size: 90%;
}
*/
/* SECTION 6: more reveal.js specific additions by @skypanther */
ul, ol, div, p {
visibility: visible;
position: static;
width: auto;
height: auto;
display: block;
overflow: visible;
margin: 0;
text-align: left !important;
}
.reveal pre,
.reveal table {
margin-left: 0;
margin-right: 0;
}
.reveal pre code {
padding: 20px;
border: 1px solid #ddd;
}
.reveal blockquote {
margin: 20px 0;
}
.reveal .slides {
position: static !important;
width: auto !important;
height: auto !important;
left: 0 !important;
top: 0 !important;
margin-left: 0 !important;
margin-top: 0 !important;
padding: 0 !important;
zoom: 1 !important;
overflow: visible !important;
display: block !important;
text-align: left !important;
-webkit-perspective: none;
-moz-perspective: none;
-ms-perspective: none;
perspective: none;
-webkit-perspective-origin: 50% 50%;
-moz-perspective-origin: 50% 50%;
-ms-perspective-origin: 50% 50%;
perspective-origin: 50% 50%;
}
.reveal .slides section {
visibility: visible !important;
position: static !important;
width: auto !important;
height: auto !important;
display: block !important;
overflow: visible !important;
left: 0 !important;
top: 0 !important;
margin-left: 0 !important;
margin-top: 0 !important;
padding: 60px 20px !important;
z-index: auto !important;
opacity: 1 !important;
page-break-after: always !important;
-webkit-transform-style: flat !important;
-moz-transform-style: flat !important;
-ms-transform-style: flat !important;
transform-style: flat !important;
-webkit-transform: none !important;
-moz-transform: none !important;
-ms-transform: none !important;
transform: none !important;
-webkit-transition: none !important;
-moz-transition: none !important;
-ms-transition: none !important;
transition: none !important;
}
.reveal .slides section.stack {
padding: 0 !important;
}
.reveal section:last-of-type {
page-break-after: avoid !important;
}
.reveal section .fragment {
opacity: 1 !important;
visibility: visible !important;
-webkit-transform: none !important;
-moz-transform: none !important;
-ms-transform: none !important;
transform: none !important;
}
.reveal section img {
display: block;
margin: 15px 0px;
background: rgba(255,255,255,1);
border: 1px solid #666;
box-shadow: none;
}
.reveal section small {
font-size: 0.8em;
}
}

164
css/print/pdf.css Normal file
View File

@ -0,0 +1,164 @@
/**
* This stylesheet is used to print reveal.js
* presentations to PDF.
*
* https://github.com/hakimel/reveal.js#pdf-export
*/
* {
-webkit-print-color-adjust: exact;
}
body {
margin: 0 auto !important;
border: 0;
padding: 0;
float: none !important;
overflow: visible;
}
html {
width: 100%;
height: 100%;
overflow: visible;
}
/* Remove any elements not needed in print. */
.nestedarrow,
.reveal .controls,
.reveal .progress,
.reveal .playback,
.reveal.overview,
.fork-reveal,
.share-reveal,
.state-background {
display: none !important;
}
h1, h2, h3, h4, h5, h6 {
text-shadow: 0 0 0 #000 !important;
}
.reveal pre code {
overflow: hidden !important;
font-family: Courier, 'Courier New', monospace !important;
}
ul, ol, div, p {
visibility: visible;
position: static;
width: auto;
height: auto;
display: block;
overflow: visible;
margin: auto;
}
.reveal {
width: auto !important;
height: auto !important;
overflow: hidden !important;
}
.reveal .slides {
position: static;
width: 100% !important;
height: auto !important;
zoom: 1 !important;
left: auto;
top: auto;
margin: 0 !important;
padding: 0 !important;
overflow: visible;
display: block;
perspective: none;
perspective-origin: 50% 50%;
}
.reveal .slides .pdf-page {
position: relative;
overflow: hidden;
z-index: 1;
page-break-after: always;
}
.reveal .slides section {
visibility: visible !important;
display: block !important;
position: absolute !important;
margin: 0 !important;
padding: 0 !important;
box-sizing: border-box !important;
min-height: 1px;
opacity: 1 !important;
transform-style: flat !important;
transform: none !important;
}
.reveal section.stack {
position: relative !important;
margin: 0 !important;
padding: 0 !important;
page-break-after: avoid !important;
height: auto !important;
min-height: auto !important;
}
.reveal img {
box-shadow: none;
}
.reveal .roll {
overflow: visible;
line-height: 1em;
}
/* Slide backgrounds are placed inside of their slide when exporting to PDF */
.reveal .slide-background {
display: block !important;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: auto !important;
}
/* Display slide speaker notes when 'showNotes' is enabled */
.reveal.show-notes {
max-width: none;
max-height: none;
}
.reveal .speaker-notes-pdf {
display: block;
width: 100%;
height: auto;
max-height: none;
top: auto;
right: auto;
bottom: auto;
left: auto;
z-index: 100;
}
/* Layout option which makes notes appear on a separate page */
.reveal .speaker-notes-pdf[data-layout="separate-page"] {
position: relative;
color: inherit;
background-color: transparent;
padding: 20px;
page-break-after: always;
border: 0;
}
/* Display slide numbers when 'slideNumber' is enabled */
.reveal .slide-number-pdf {
display: block;
position: absolute;
font-size: 14px;
}

1591
css/reveal.css Normal file

File diff suppressed because it is too large Load Diff

1764
css/reveal.scss Normal file

File diff suppressed because it is too large Load Diff

21
css/theme/README.md Normal file
View File

@ -0,0 +1,21 @@
## Dependencies
Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment including the Grunt dependencies installed before proceeding: https://github.com/hakimel/reveal.js#full-setup
## Creating a Theme
To create your own theme, start by duplicating a ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source). It will be automatically compiled by Grunt from Sass to CSS (see the [Gruntfile](https://github.com/hakimel/reveal.js/blob/master/Gruntfile.js)) when you run `npm run build -- css-themes`.
Each theme file does four things in the following order:
1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)**
Shared utility functions.
2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)**
Declares a set of custom variables that the template file (step 4) expects. Can be overridden in step 3.
3. **Override**
This is where you override the default theme. Either by specifying variables (see [settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss) for reference) or by adding any selectors and styles you please.
4. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)**
The template theme file which will generate final CSS output based on the currently defined variables.

277
css/theme/beige.css Normal file
View File

@ -0,0 +1,277 @@
/**
* Beige theme for reveal.js.
*
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
*/
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
background: #f7f2d3;
background: -moz-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, white), color-stop(100%, #f7f2d3));
background: -webkit-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
background: -o-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
background: -ms-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
background: radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
background-color: #f7f3de; }
.reveal {
font-family: "Lato", sans-serif;
font-size: 40px;
font-weight: normal;
color: #333; }
::selection {
color: #fff;
background: rgba(79, 64, 28, 0.99);
text-shadow: none; }
::-moz-selection {
color: #fff;
background: rgba(79, 64, 28, 0.99);
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
/*********************************************
* HEADERS
*********************************************/
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
margin: 0 0 20px 0;
color: #333;
font-family: "League Gothic", Impact, sans-serif;
font-weight: normal;
line-height: 1.2;
letter-spacing: normal;
text-transform: uppercase;
text-shadow: none;
word-wrap: break-word; }
.reveal h1 {
font-size: 3.77em; }
.reveal h2 {
font-size: 2.11em; }
.reveal h3 {
font-size: 1.55em; }
.reveal h4 {
font-size: 1em; }
.reveal h1 {
text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); }
/*********************************************
* OTHER
*********************************************/
.reveal p {
margin: 20px 0;
line-height: 1.3; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
.reveal iframe {
max-width: 95%;
max-height: 95%; }
.reveal strong,
.reveal b {
font-weight: bold; }
.reveal em {
font-style: italic; }
.reveal ol,
.reveal dl,
.reveal ul {
display: inline-block;
text-align: left;
margin: 0 0 0 1em; }
.reveal ol {
list-style-type: decimal; }
.reveal ul {
list-style-type: disc; }
.reveal ul ul {
list-style-type: square; }
.reveal ul ul ul {
list-style-type: circle; }
.reveal ul ul,
.reveal ul ol,
.reveal ol ol,
.reveal ol ul {
display: block;
margin-left: 40px; }
.reveal dt {
font-weight: bold; }
.reveal dd {
margin-left: 40px; }
.reveal blockquote {
display: block;
position: relative;
width: 70%;
margin: 20px auto;
padding: 5px;
font-style: italic;
background: rgba(255, 255, 255, 0.05);
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
.reveal blockquote p:first-child,
.reveal blockquote p:last-child {
display: inline-block; }
.reveal q {
font-style: italic; }
.reveal pre {
display: block;
position: relative;
width: 90%;
margin: 20px auto;
text-align: left;
font-size: 0.55em;
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
.reveal code {
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
padding: 5px;
overflow: auto;
max-height: 400px;
word-wrap: normal; }
.reveal table {
margin: auto;
border-collapse: collapse;
border-spacing: 0; }
.reveal table th {
font-weight: bold; }
.reveal table th,
.reveal table td {
text-align: left;
padding: 0.2em 0.5em 0.2em 0.5em;
border-bottom: 1px solid; }
.reveal table th[align="center"],
.reveal table td[align="center"] {
text-align: center; }
.reveal table th[align="right"],
.reveal table td[align="right"] {
text-align: right; }
.reveal table tbody tr:last-child th,
.reveal table tbody tr:last-child td {
border-bottom: none; }
.reveal sup {
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
font-size: 0.6em;
line-height: 1.2em;
vertical-align: top; }
.reveal small * {
vertical-align: top; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #8b743d;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
color: #c0a86e;
text-shadow: none;
border: none; }
.reveal .roll span:after {
color: #fff;
background: #564826; }
/*********************************************
* IMAGES
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
border: 4px solid #333;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
border-color: #8b743d;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls {
color: #8b743d; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2);
color: #8b743d; }
.reveal .progress span {
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #f7f3de; } }

273
css/theme/black.css Normal file
View File

@ -0,0 +1,273 @@
/**
* Black theme for reveal.js. This is the opposite of the 'white' theme.
*
* By Hakim El Hattab, http://hakim.se
*/
@import url(../../lib/font/source-sans-pro/source-sans-pro.css);
section.has-light-background, section.has-light-background h1, section.has-light-background h2, section.has-light-background h3, section.has-light-background h4, section.has-light-background h5, section.has-light-background h6 {
color: #222; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
background: #222;
background-color: #222; }
.reveal {
font-family: "Source Sans Pro", Helvetica, sans-serif;
font-size: 42px;
font-weight: normal;
color: #fff; }
::selection {
color: #fff;
background: #bee4fd;
text-shadow: none; }
::-moz-selection {
color: #fff;
background: #bee4fd;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
/*********************************************
* HEADERS
*********************************************/
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
margin: 0 0 20px 0;
color: #fff;
font-family: "Source Sans Pro", Helvetica, sans-serif;
font-weight: 600;
line-height: 1.2;
letter-spacing: normal;
text-transform: uppercase;
text-shadow: none;
word-wrap: break-word; }
.reveal h1 {
font-size: 2.5em; }
.reveal h2 {
font-size: 1.6em; }
.reveal h3 {
font-size: 1.3em; }
.reveal h4 {
font-size: 1em; }
.reveal h1 {
text-shadow: none; }
/*********************************************
* OTHER
*********************************************/
.reveal p {
margin: 20px 0;
line-height: 1.3; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
.reveal iframe {
max-width: 95%;
max-height: 95%; }
.reveal strong,
.reveal b {
font-weight: bold; }
.reveal em {
font-style: italic; }
.reveal ol,
.reveal dl,
.reveal ul {
display: inline-block;
text-align: left;
margin: 0 0 0 1em; }
.reveal ol {
list-style-type: decimal; }
.reveal ul {
list-style-type: disc; }
.reveal ul ul {
list-style-type: square; }
.reveal ul ul ul {
list-style-type: circle; }
.reveal ul ul,
.reveal ul ol,
.reveal ol ol,
.reveal ol ul {
display: block;
margin-left: 40px; }
.reveal dt {
font-weight: bold; }
.reveal dd {
margin-left: 40px; }
.reveal blockquote {
display: block;
position: relative;
width: 70%;
margin: 20px auto;
padding: 5px;
font-style: italic;
background: rgba(255, 255, 255, 0.05);
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
.reveal blockquote p:first-child,
.reveal blockquote p:last-child {
display: inline-block; }
.reveal q {
font-style: italic; }
.reveal pre {
display: block;
position: relative;
width: 90%;
margin: 20px auto;
text-align: left;
font-size: 0.55em;
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
.reveal code {
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
padding: 5px;
overflow: auto;
max-height: 400px;
word-wrap: normal; }
.reveal table {
margin: auto;
border-collapse: collapse;
border-spacing: 0; }
.reveal table th {
font-weight: bold; }
.reveal table th,
.reveal table td {
text-align: left;
padding: 0.2em 0.5em 0.2em 0.5em;
border-bottom: 1px solid; }
.reveal table th[align="center"],
.reveal table td[align="center"] {
text-align: center; }
.reveal table th[align="right"],
.reveal table td[align="right"] {
text-align: right; }
.reveal table tbody tr:last-child th,
.reveal table tbody tr:last-child td {
border-bottom: none; }
.reveal sup {
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
font-size: 0.6em;
line-height: 1.2em;
vertical-align: top; }
.reveal small * {
vertical-align: top; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #42affa;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
color: #8dcffc;
text-shadow: none;
border: none; }
.reveal .roll span:after {
color: #fff;
background: #068de9; }
/*********************************************
* IMAGES
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
border: 4px solid #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
border-color: #42affa;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls {
color: #42affa; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2);
color: #42affa; }
.reveal .progress span {
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #222; } }

296
css/theme/blood.css Normal file
View File

@ -0,0 +1,296 @@
/**
* Blood theme for reveal.js
* Author: Walther http://github.com/Walther
*
* Designed to be used with highlight.js theme
* "monokai_sublime.css" available from
* https://github.com/isagalaev/highlight.js/
*
* For other themes, change $codeBackground accordingly.
*
*/
@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic);
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
background: #222;
background-color: #222; }
.reveal {
font-family: Ubuntu, "sans-serif";
font-size: 40px;
font-weight: normal;
color: #eee; }
::selection {
color: #fff;
background: #a23;
text-shadow: none; }
::-moz-selection {
color: #fff;
background: #a23;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
/*********************************************
* HEADERS
*********************************************/
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
margin: 0 0 20px 0;
color: #eee;
font-family: Ubuntu, "sans-serif";
font-weight: normal;
line-height: 1.2;
letter-spacing: normal;
text-transform: uppercase;
text-shadow: 2px 2px 2px #222;
word-wrap: break-word; }
.reveal h1 {
font-size: 3.77em; }
.reveal h2 {
font-size: 2.11em; }
.reveal h3 {
font-size: 1.55em; }
.reveal h4 {
font-size: 1em; }
.reveal h1 {
text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); }
/*********************************************
* OTHER
*********************************************/
.reveal p {
margin: 20px 0;
line-height: 1.3; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
.reveal iframe {
max-width: 95%;
max-height: 95%; }
.reveal strong,
.reveal b {
font-weight: bold; }
.reveal em {
font-style: italic; }
.reveal ol,
.reveal dl,
.reveal ul {
display: inline-block;
text-align: left;
margin: 0 0 0 1em; }
.reveal ol {
list-style-type: decimal; }
.reveal ul {
list-style-type: disc; }
.reveal ul ul {
list-style-type: square; }
.reveal ul ul ul {
list-style-type: circle; }
.reveal ul ul,
.reveal ul ol,
.reveal ol ol,
.reveal ol ul {
display: block;
margin-left: 40px; }
.reveal dt {
font-weight: bold; }
.reveal dd {
margin-left: 40px; }
.reveal blockquote {
display: block;
position: relative;
width: 70%;
margin: 20px auto;
padding: 5px;
font-style: italic;
background: rgba(255, 255, 255, 0.05);
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
.reveal blockquote p:first-child,
.reveal blockquote p:last-child {
display: inline-block; }
.reveal q {
font-style: italic; }
.reveal pre {
display: block;
position: relative;
width: 90%;
margin: 20px auto;
text-align: left;
font-size: 0.55em;
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
.reveal code {
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
padding: 5px;
overflow: auto;
max-height: 400px;
word-wrap: normal; }
.reveal table {
margin: auto;
border-collapse: collapse;
border-spacing: 0; }
.reveal table th {
font-weight: bold; }
.reveal table th,
.reveal table td {
text-align: left;
padding: 0.2em 0.5em 0.2em 0.5em;
border-bottom: 1px solid; }
.reveal table th[align="center"],
.reveal table td[align="center"] {
text-align: center; }
.reveal table th[align="right"],
.reveal table td[align="right"] {
text-align: right; }
.reveal table tbody tr:last-child th,
.reveal table tbody tr:last-child td {
border-bottom: none; }
.reveal sup {
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
font-size: 0.6em;
line-height: 1.2em;
vertical-align: top; }
.reveal small * {
vertical-align: top; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #a23;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
color: #dd5566;
text-shadow: none;
border: none; }
.reveal .roll span:after {
color: #fff;
background: #6a1520; }
/*********************************************
* IMAGES
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
border: 4px solid #eee;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
border-color: #a23;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls {
color: #a23; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2);
color: #a23; }
.reveal .progress span {
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #222; } }
.reveal p {
font-weight: 300;
text-shadow: 1px 1px #222; }
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
font-weight: 700; }
.reveal p code {
background-color: #23241f;
display: inline-block;
border-radius: 7px; }
.reveal small code {
vertical-align: baseline; }

Binary file not shown.

BIN
css/theme/lca2019-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

104
css/theme/lca2019-logo.svg Normal file
View File

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 300 59" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="Layer1">
<g transform="matrix(0.358738,0,0,0.358738,-243.672,-84.2961)">
<circle cx="1043.91" cy="285.315" r="7.44" style="fill:white;"/>
</g>
<g transform="matrix(0.358738,0,0,0.358738,-227.465,-48.5259)">
<circle cx="1043.91" cy="285.315" r="7.44" style="fill:white;"/>
</g>
<g transform="matrix(0.358738,0,0,0.358738,-259.213,-48.3855)">
<circle cx="1043.91" cy="285.315" r="7.44" style="fill:white;"/>
</g>
</g>
<g transform="matrix(1,0,0,1,44.4276,8.67429)">
<rect x="0" y="0" width="227.119" height="58.205" style="fill:none;"/>
<clipPath id="_clip1">
<rect x="0" y="0" width="227.119" height="58.205"/>
</clipPath>
<g clip-path="url(#_clip1)">
<g transform="matrix(0.0413847,0,0,0.0413386,0,0)">
<path d="M-8,1112L600,1112" style="fill:none;stroke:white;stroke-width:64.04px;"/>
</g>
<g transform="matrix(0.0413847,0,0,0.0413386,0,0)">
<path d="M24,168L24,1080" style="fill:none;stroke:white;stroke-width:64.04px;"/>
</g>
<g transform="matrix(0.0413847,0,0,0.0413386,0,0)">
<path d="M1096,152L1021,159L955,177L898,209L850,253L811,309L783,376L766,454L760,543L760,770L766,860L783,940L811,1007L849,1062L898,1105L955,1136L1021,1154L1096,1160L1136,1158L1209,1145L1271,1119L1303,1099L1096,1099L1034,1093L933,1047L867,959L835,836L831,761L831,551L835,481L847,417L895,311L979,238L1096,213L1303,213L1299,210L1242,179L1174,159L1136,154L1096,152ZM1431,825L1361,825L1360,850L1357,874L1337,945L1299,1011L1240,1062L1161,1093L1096,1099L1303,1099L1365,1037L1409,953L1425,891L1430,859L1431,825ZM1303,213L1096,213L1129,215L1160,219L1239,250L1297,301L1336,367L1356,439L1361,487L1431,487L1425,421L1409,360L1383,301L1324,229L1303,213Z" style="fill:white;"/>
</g>
<g transform="matrix(0.0413847,0,0,0.0413386,0,0)">
<path d="M2192,296L2183,307L2174,316L2164,325L2152,332L2477,1064L2536,1064L2192,296Z" style="fill:white;"/>
</g>
<g transform="matrix(0.0413847,0,0,0.0413386,0,0)">
<path d="M2194,296L2152,335L2475,1064L2536,1064L2535,1060L2477,1060L2157,336L2167,329L2177,321L2185,313L2193,303L2197,303L2194,296ZM2197,303L2193,303L2531,1060L2535,1060L2197,303Z" style="fill:white;"/>
</g>
<g transform="matrix(0.0413847,0,0,0.0413386,0,0)">
<path d="M1745,943L1696,943L1708,944L1720,946L1731,948L1741,952L1745,943ZM2029,200L1688,944L1691,944L1694,943L1745,943L2072,225L2029,200Z" style="fill:white;"/>
</g>
<g transform="matrix(0.0413847,0,0,0.0413386,0,0)">
<path d="M1728,959L1699,959L1711,960L1722,961L1734,964L1745,968L1747,968L1749,964L1745,964L1733,960L1728,959ZM2050,205L2043,205L2084,228L1745,964L1749,964L2088,227L2050,205ZM2041,200L1690,958L1688,960L1693,960L1698,959L1728,959L1722,958L1711,956L1709,956L1694,956L2043,205L2050,205L2041,200ZM1699,956L1697,956L1694,956L1709,956L1699,956Z" style="fill:white;"/>
</g>
<g transform="matrix(0.0413847,0,0,0.0413386,0,0)">
<path d="M1712,1136L2368,1136" style="fill:none;stroke:white;stroke-width:48.03px;"/>
</g>
<g transform="matrix(0.0413847,0,0,0.0413386,0,0)">
<path d="M2360,1096L1704,1096L1704,1144L2376,1144L2375,1141L2374,1141L1708,1141L1708,1100L2360,1100L2360,1098L2360,1096ZM2360,1100L2357,1100L2359,1110L2362,1121L2365,1131L2370,1141L2374,1141L2369,1131L2365,1120L2362,1109L2360,1100Z" style="fill:white;"/>
</g>
</g>
<rect x="0" y="0" width="260.889" height="58.205" style="fill:none;"/>
<g transform="matrix(0.662156,0,0,0.661417,123.817,16.2896)">
<text x="0px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">L</text>
<text x="8.008px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">I</text>
<text x="14.007px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">N</text>
<text x="25.998px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">U</text>
<text x="37.99px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">X</text>
<text x="47.991px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">.</text>
<text x="52.647px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">C</text>
<text x="62.484px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">O</text>
<text x="75.486px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">N</text>
<text x="87.476px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">F</text>
<text x="91.695px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">.</text>
<text x="96.814px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">A</text>
<text x="107.51px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">U</text>
</g>
<g transform="matrix(0.662156,0,0,0.661417,123.817,30.8408)">
<text x="0px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">2<tspan x="9.997px " y="0px ">1</tspan></text>
</g>
<g transform="matrix(0.662156,0,0,0.661417,137.06,30.8408)">
<text x="0px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">-</text>
</g>
<g transform="matrix(0.662156,0,0,0.661417,141.033,30.8408)">
<text x="0px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">2</text>
<text x="9.997px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">5</text>
<text x="22.995px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">J</text>
<text x="28.992px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">a</text>
<text x="37.992px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">nu</text>
<text x="58.007px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">a</text>
<text x="67.007px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">r</text>
<text x="74.093px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">y</text>
</g>
<g transform="matrix(0.662156,0,0,0.661417,197.316,30.8408)">
<text x="0px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">2<tspan x="9.997px 19.994px " y="0px 0px ">01</tspan></text>
<text x="29.991px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">9</text>
</g>
<g transform="matrix(0.662156,0,0,0.661417,123.817,46.7148)">
<text x="0px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">C</text>
<text x="10.004px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">h</text>
<text x="20.011px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">r</text>
<text x="27.004px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">i</text>
<text x="30.995px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">s</text>
<text x="38.783px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">t</text>
<text x="44.551px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">c</text>
<text x="52.548px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">hu</text>
<text x="72.563px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">r</text>
<text x="79.277px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">c</text>
<text x="87.275px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">h</text>
<text x="97.282px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">,</text>
</g>
<g transform="matrix(0.662156,0,0,0.661417,194.005,46.7148)">
<text x="0px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">N</text>
<text x="11.991px" y="0px" style="font-family:'Calibri', sans-serif;font-size:19px;fill:white;">Z</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 1920 1080" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;">
<g transform="matrix(1.69866,0,0,1.70089,417.856,277.875)">
<g transform="matrix(0.525346,0,0,0.524658,-321.333,-145.799)">
<circle cx="1043.91" cy="285.315" r="7.44" style="fill:rgb(206,214,198);stroke:rgb(206,214,198);stroke-width:1.12px;"/>
</g>
<g transform="matrix(0.525346,0,0,0.524658,86.527,61.2342)">
<circle cx="1043.91" cy="285.315" r="7.44" style="fill:rgb(206,214,198);stroke:rgb(206,214,198);stroke-width:1.12px;"/>
</g>
<g transform="matrix(0.525346,0,0,0.524658,-544.774,155.817)">
<circle cx="1043.91" cy="285.315" r="7.44" style="fill:rgb(206,214,198);stroke:rgb(206,214,198);stroke-width:1.12px;"/>
</g>
<rect x="0" y="0" width="638.318" height="308.22" style="fill:none;"/>
<g transform="matrix(0.0413847,0,0,0.0413386,0,0)">
<path d="M240,7087L5200,416" style="fill:none;stroke:rgb(206,214,198);stroke-width:16.01px;stroke-linecap:butt;stroke-miterlimit:1.41421;"/>
</g>
<g transform="matrix(0.0413847,0,0,0.0413386,0,0)">
<path d="M14960,4896L5936,272" style="fill:none;stroke:rgb(206,214,198);stroke-width:16.01px;stroke-linecap:butt;stroke-miterlimit:1.41421;"/>
</g>
<g transform="matrix(0.0413847,0,0,0.0413386,0,0)">
<path d="M464,7376L14928,5280" style="fill:none;stroke:rgb(206,214,198);stroke-width:16.01px;stroke-linecap:butt;stroke-miterlimit:1.41421;"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 1920 1080" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;">
<g transform="matrix(0.0702988,0,0,0.0703125,0.56239,0.5625)">
<rect x="-8" y="-8" width="27312" height="15360" style="fill:rgb(56,122,59);"/>
</g>
<g transform="matrix(1.69866,0,0,1.70089,417.856,277.875)">
<g transform="matrix(0.525346,0,0,0.524658,-321.333,-145.799)">
<circle cx="1043.91" cy="285.315" r="7.44" style="fill:rgb(206,214,198);stroke:rgb(206,214,198);stroke-width:1.12px;"/>
</g>
<g transform="matrix(0.525346,0,0,0.524658,86.527,61.2342)">
<circle cx="1043.91" cy="285.315" r="7.44" style="fill:rgb(206,214,198);stroke:rgb(206,214,198);stroke-width:1.12px;"/>
</g>
<g transform="matrix(0.525346,0,0,0.524658,-544.774,155.817)">
<circle cx="1043.91" cy="285.315" r="7.44" style="fill:rgb(206,214,198);stroke:rgb(206,214,198);stroke-width:1.12px;"/>
</g>
<rect x="0" y="0" width="638.318" height="308.22" style="fill:none;"/>
<g transform="matrix(0.0413847,0,0,0.0413386,0,0)">
<path d="M240,7087L5200,416" style="fill:none;stroke:rgb(206,214,198);stroke-width:16.01px;stroke-linecap:butt;stroke-miterlimit:1.41421;"/>
</g>
<g transform="matrix(0.0413847,0,0,0.0413386,0,0)">
<path d="M14960,4896L5936,272" style="fill:none;stroke:rgb(206,214,198);stroke-width:16.01px;stroke-linecap:butt;stroke-miterlimit:1.41421;"/>
</g>
<g transform="matrix(0.0413847,0,0,0.0413386,0,0)">
<path d="M464,7376L14928,5280" style="fill:none;stroke:rgb(206,214,198);stroke-width:16.01px;stroke-linecap:butt;stroke-miterlimit:1.41421;"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

422
css/theme/lca2019.css Normal file
View File

@ -0,0 +1,422 @@
/**
* Black theme for reveal.js. This is the opposite of the 'white' theme.
*
* By Hakim El Hattab, http://hakim.se
*/
@import url(../../lib/font/space-mono/space-mono.css);
section.has-light-background,
section.has-light-background h1,
section.has-light-background h2,
section.has-light-background h3,
section.has-light-background h4,
section.has-light-background h5,
section.has-light-background h6 {
color: #222;
}
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
background: #387A3B;
background-color: #387A3B;
}
.reveal .footer {
position: absolute;
bottom: 1em;
right: 2em;
text-align: right;
font-size: 0.5em;
width: 100%;
height: 96px;
background-image: url("lca2019-logo.svg");
background-repeat: no-repeat;
display: flex;
justify-content: flex-end;
align-items: flex-end;
z-index: 1;
}
.reveal .footer .url {
position: absolute;
padding-bottom: 30px;
}
.reveal .footer .theme {
padding-right: 80px;
}
.reveal .footer .hashtag {
padding-right: 80px;
}
@media only screen and (max-width:800px) {
.reveal .footer .url {
display: none;
}
}
@media only screen and (max-width:550px) {
.reveal .footer {
background-image: none;
}
}
@media only screen and (max-width:750px) {
.reveal .footer .twitter {
display: none;
}
}
@media only screen and (max-width:1050px) {
.reveal .footer .theme {
display: none;
}
}
@media only screen and (max-width:1300px) {
.reveal .footer .hashtag {
display: none;
}
}
.reveal {
font-family: "Space Mono", Helvetica, sans-serif;
font-size: 42px;
font-weight: normal;
color: #fff;
}
::selection {
color: #fff;
background: #bee4fd;
text-shadow: none;
}
::-moz-selection {
color: #fff;
background: #bee4fd;
text-shadow: none;
}
.reveal .slides section,
.reveal .slides section>section {
line-height: 1.3;
font-weight: inherit;
}
/*********************************************
* HEADERS
*********************************************/
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
margin: 0 0 20px 0;
color: #fff;
font-family: "Space Mono", Helvetica, sans-serif;
font-weight: 600;
line-height: 1.2;
letter-spacing: normal;
text-transform: uppercase;
text-shadow: none;
word-wrap: break-word;
}
.reveal h1 {
font-size: 2.5em;
}
.reveal h2 {
font-size: 1.6em;
}
.reveal h3 {
font-size: 1.3em;
}
.reveal h4 {
font-size: 1em;
}
.reveal h1 {
text-shadow: none;
}
/*********************************************
* OTHER
*********************************************/
.reveal p {
margin: 20px 0;
line-height: 1.3;
}
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
.reveal iframe {
max-width: 95%;
max-height: 95%;
}
.reveal strong,
.reveal b {
font-weight: bold;
}
.reveal em {
font-style: italic;
}
.reveal ol,
.reveal dl,
.reveal ul {
display: inline-block;
text-align: left;
margin: 0 0 0 1em;
}
.reveal ol {
list-style-type: decimal;
}
.reveal ul {
list-style-type: disc;
}
.reveal ul ul {
list-style-type: square;
}
.reveal ul ul ul {
list-style-type: circle;
}
.reveal ul ul,
.reveal ul ol,
.reveal ol ol,
.reveal ol ul {
display: block;
margin-left: 40px;
}
.reveal dt {
font-weight: bold;
}
.reveal dd {
margin-left: 40px;
}
.reveal blockquote {
display: block;
position: relative;
width: 70%;
margin: 20px auto;
padding: 5px;
font-style: italic;
background: rgba(255, 255, 255, 0.05);
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2);
}
.reveal blockquote p:first-child,
.reveal blockquote p:last-child {
display: inline-block;
}
.reveal q {
font-style: italic;
}
.reveal pre {
display: block;
position: relative;
width: 90%;
margin: 20px auto;
text-align: left;
font-size: 0.55em;
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3);
}
.reveal code {
font-family: monospace;
text-transform: none;
}
.reveal pre code {
display: block;
padding: 5px;
overflow: auto;
max-height: 400px;
word-wrap: normal;
}
.reveal table {
margin: auto;
border-collapse: collapse;
border-spacing: 0;
}
.reveal table th {
font-weight: bold;
}
.reveal table th,
.reveal table td {
text-align: left;
padding: 0.2em 0.5em 0.2em 0.5em;
border-bottom: 1px solid;
}
.reveal table th[align="center"],
.reveal table td[align="center"] {
text-align: center;
}
.reveal table th[align="right"],
.reveal table td[align="right"] {
text-align: right;
}
.reveal table tbody tr:last-child th,
.reveal table tbody tr:last-child td {
border-bottom: none;
}
.reveal sup {
vertical-align: super;
font-size: smaller;
}
.reveal sub {
vertical-align: sub;
font-size: smaller;
}
.reveal small {
display: inline-block;
font-size: 0.6em;
line-height: 1.2em;
vertical-align: top;
}
.reveal small * {
vertical-align: top;
}
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #42affa;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease;
}
.reveal a:hover {
color: #8dcffc;
text-shadow: none;
border: none;
}
.reveal .roll span:after {
color: #fff;
background: #068de9;
}
/*********************************************
* IMAGES
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
border: 4px solid #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
}
.reveal section img.plain {
border: 0;
box-shadow: none;
}
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear;
}
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
border-color: #42affa;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
}
/*********************************************
* VIDEOS
*********************************************/
.reveal section video {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
border: 4px solid #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
}
.reveal section video.plain {
border: 0;
box-shadow: none;
}
.reveal a video {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear;
}
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls {
color: #42affa;
}
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2);
color: #42affa;
}
.reveal .progress span {
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
}
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #222;
}
}

279
css/theme/league.css Normal file
View File

@ -0,0 +1,279 @@
/**
* League theme for reveal.js.
*
* This was the default theme pre-3.0.0.
*
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
*/
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
background: #1c1e20;
background: -moz-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #555a5f), color-stop(100%, #1c1e20));
background: -webkit-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
background: -o-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
background: -ms-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
background: radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
background-color: #2b2b2b; }
.reveal {
font-family: "Lato", sans-serif;
font-size: 40px;
font-weight: normal;
color: #eee; }
::selection {
color: #fff;
background: #FF5E99;
text-shadow: none; }
::-moz-selection {
color: #fff;
background: #FF5E99;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
/*********************************************
* HEADERS
*********************************************/
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
margin: 0 0 20px 0;
color: #eee;
font-family: "League Gothic", Impact, sans-serif;
font-weight: normal;
line-height: 1.2;
letter-spacing: normal;
text-transform: uppercase;
text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2);
word-wrap: break-word; }
.reveal h1 {
font-size: 3.77em; }
.reveal h2 {
font-size: 2.11em; }
.reveal h3 {
font-size: 1.55em; }
.reveal h4 {
font-size: 1em; }
.reveal h1 {
text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); }
/*********************************************
* OTHER
*********************************************/
.reveal p {
margin: 20px 0;
line-height: 1.3; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
.reveal iframe {
max-width: 95%;
max-height: 95%; }
.reveal strong,
.reveal b {
font-weight: bold; }
.reveal em {
font-style: italic; }
.reveal ol,
.reveal dl,
.reveal ul {
display: inline-block;
text-align: left;
margin: 0 0 0 1em; }
.reveal ol {
list-style-type: decimal; }
.reveal ul {
list-style-type: disc; }
.reveal ul ul {
list-style-type: square; }
.reveal ul ul ul {
list-style-type: circle; }
.reveal ul ul,
.reveal ul ol,
.reveal ol ol,
.reveal ol ul {
display: block;
margin-left: 40px; }
.reveal dt {
font-weight: bold; }
.reveal dd {
margin-left: 40px; }
.reveal blockquote {
display: block;
position: relative;
width: 70%;
margin: 20px auto;
padding: 5px;
font-style: italic;
background: rgba(255, 255, 255, 0.05);
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
.reveal blockquote p:first-child,
.reveal blockquote p:last-child {
display: inline-block; }
.reveal q {
font-style: italic; }
.reveal pre {
display: block;
position: relative;
width: 90%;
margin: 20px auto;
text-align: left;
font-size: 0.55em;
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
.reveal code {
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
padding: 5px;
overflow: auto;
max-height: 400px;
word-wrap: normal; }
.reveal table {
margin: auto;
border-collapse: collapse;
border-spacing: 0; }
.reveal table th {
font-weight: bold; }
.reveal table th,
.reveal table td {
text-align: left;
padding: 0.2em 0.5em 0.2em 0.5em;
border-bottom: 1px solid; }
.reveal table th[align="center"],
.reveal table td[align="center"] {
text-align: center; }
.reveal table th[align="right"],
.reveal table td[align="right"] {
text-align: right; }
.reveal table tbody tr:last-child th,
.reveal table tbody tr:last-child td {
border-bottom: none; }
.reveal sup {
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
font-size: 0.6em;
line-height: 1.2em;
vertical-align: top; }
.reveal small * {
vertical-align: top; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #13DAEC;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
color: #71e9f4;
text-shadow: none;
border: none; }
.reveal .roll span:after {
color: #fff;
background: #0d99a5; }
/*********************************************
* IMAGES
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
border: 4px solid #eee;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
border-color: #13DAEC;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls {
color: #13DAEC; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2);
color: #13DAEC; }
.reveal .progress span {
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #2b2b2b; } }

277
css/theme/moon.css Normal file
View File

@ -0,0 +1,277 @@
/**
* Solarized Dark theme for reveal.js.
* Author: Achim Staebler
*/
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
/**
* Solarized colors by Ethan Schoonover
*/
html * {
color-profile: sRGB;
rendering-intent: auto; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
background: #002b36;
background-color: #002b36; }
.reveal {
font-family: "Lato", sans-serif;
font-size: 40px;
font-weight: normal;
color: #93a1a1; }
::selection {
color: #fff;
background: #d33682;
text-shadow: none; }
::-moz-selection {
color: #fff;
background: #d33682;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
/*********************************************
* HEADERS
*********************************************/
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
margin: 0 0 20px 0;
color: #eee8d5;
font-family: "League Gothic", Impact, sans-serif;
font-weight: normal;
line-height: 1.2;
letter-spacing: normal;
text-transform: uppercase;
text-shadow: none;
word-wrap: break-word; }
.reveal h1 {
font-size: 3.77em; }
.reveal h2 {
font-size: 2.11em; }
.reveal h3 {
font-size: 1.55em; }
.reveal h4 {
font-size: 1em; }
.reveal h1 {
text-shadow: none; }
/*********************************************
* OTHER
*********************************************/
.reveal p {
margin: 20px 0;
line-height: 1.3; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
.reveal iframe {
max-width: 95%;
max-height: 95%; }
.reveal strong,
.reveal b {
font-weight: bold; }
.reveal em {
font-style: italic; }
.reveal ol,
.reveal dl,
.reveal ul {
display: inline-block;
text-align: left;
margin: 0 0 0 1em; }
.reveal ol {
list-style-type: decimal; }
.reveal ul {
list-style-type: disc; }
.reveal ul ul {
list-style-type: square; }
.reveal ul ul ul {
list-style-type: circle; }
.reveal ul ul,
.reveal ul ol,
.reveal ol ol,
.reveal ol ul {
display: block;
margin-left: 40px; }
.reveal dt {
font-weight: bold; }
.reveal dd {
margin-left: 40px; }
.reveal blockquote {
display: block;
position: relative;
width: 70%;
margin: 20px auto;
padding: 5px;
font-style: italic;
background: rgba(255, 255, 255, 0.05);
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
.reveal blockquote p:first-child,
.reveal blockquote p:last-child {
display: inline-block; }
.reveal q {
font-style: italic; }
.reveal pre {
display: block;
position: relative;
width: 90%;
margin: 20px auto;
text-align: left;
font-size: 0.55em;
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
.reveal code {
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
padding: 5px;
overflow: auto;
max-height: 400px;
word-wrap: normal; }
.reveal table {
margin: auto;
border-collapse: collapse;
border-spacing: 0; }
.reveal table th {
font-weight: bold; }
.reveal table th,
.reveal table td {
text-align: left;
padding: 0.2em 0.5em 0.2em 0.5em;
border-bottom: 1px solid; }
.reveal table th[align="center"],
.reveal table td[align="center"] {
text-align: center; }
.reveal table th[align="right"],
.reveal table td[align="right"] {
text-align: right; }
.reveal table tbody tr:last-child th,
.reveal table tbody tr:last-child td {
border-bottom: none; }
.reveal sup {
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
font-size: 0.6em;
line-height: 1.2em;
vertical-align: top; }
.reveal small * {
vertical-align: top; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #268bd2;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
color: #78b9e6;
text-shadow: none;
border: none; }
.reveal .roll span:after {
color: #fff;
background: #1a6091; }
/*********************************************
* IMAGES
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
border: 4px solid #93a1a1;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
border-color: #268bd2;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls {
color: #268bd2; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2);
color: #268bd2; }
.reveal .progress span {
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #002b36; } }

271
css/theme/night.css Normal file
View File

@ -0,0 +1,271 @@
/**
* Black theme for reveal.js.
*
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
*/
@import url(https://fonts.googleapis.com/css?family=Montserrat:700);
@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic);
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
background: #111;
background-color: #111; }
.reveal {
font-family: "Open Sans", sans-serif;
font-size: 40px;
font-weight: normal;
color: #eee; }
::selection {
color: #fff;
background: #e7ad52;
text-shadow: none; }
::-moz-selection {
color: #fff;
background: #e7ad52;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
/*********************************************
* HEADERS
*********************************************/
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
margin: 0 0 20px 0;
color: #eee;
font-family: "Montserrat", Impact, sans-serif;
font-weight: normal;
line-height: 1.2;
letter-spacing: -0.03em;
text-transform: none;
text-shadow: none;
word-wrap: break-word; }
.reveal h1 {
font-size: 3.77em; }
.reveal h2 {
font-size: 2.11em; }
.reveal h3 {
font-size: 1.55em; }
.reveal h4 {
font-size: 1em; }
.reveal h1 {
text-shadow: none; }
/*********************************************
* OTHER
*********************************************/
.reveal p {
margin: 20px 0;
line-height: 1.3; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
.reveal iframe {
max-width: 95%;
max-height: 95%; }
.reveal strong,
.reveal b {
font-weight: bold; }
.reveal em {
font-style: italic; }
.reveal ol,
.reveal dl,
.reveal ul {
display: inline-block;
text-align: left;
margin: 0 0 0 1em; }
.reveal ol {
list-style-type: decimal; }
.reveal ul {
list-style-type: disc; }
.reveal ul ul {
list-style-type: square; }
.reveal ul ul ul {
list-style-type: circle; }
.reveal ul ul,
.reveal ul ol,
.reveal ol ol,
.reveal ol ul {
display: block;
margin-left: 40px; }
.reveal dt {
font-weight: bold; }
.reveal dd {
margin-left: 40px; }
.reveal blockquote {
display: block;
position: relative;
width: 70%;
margin: 20px auto;
padding: 5px;
font-style: italic;
background: rgba(255, 255, 255, 0.05);
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
.reveal blockquote p:first-child,
.reveal blockquote p:last-child {
display: inline-block; }
.reveal q {
font-style: italic; }
.reveal pre {
display: block;
position: relative;
width: 90%;
margin: 20px auto;
text-align: left;
font-size: 0.55em;
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
.reveal code {
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
padding: 5px;
overflow: auto;
max-height: 400px;
word-wrap: normal; }
.reveal table {
margin: auto;
border-collapse: collapse;
border-spacing: 0; }
.reveal table th {
font-weight: bold; }
.reveal table th,
.reveal table td {
text-align: left;
padding: 0.2em 0.5em 0.2em 0.5em;
border-bottom: 1px solid; }
.reveal table th[align="center"],
.reveal table td[align="center"] {
text-align: center; }
.reveal table th[align="right"],
.reveal table td[align="right"] {
text-align: right; }
.reveal table tbody tr:last-child th,
.reveal table tbody tr:last-child td {
border-bottom: none; }
.reveal sup {
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
font-size: 0.6em;
line-height: 1.2em;
vertical-align: top; }
.reveal small * {
vertical-align: top; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #e7ad52;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
color: #f3d7ac;
text-shadow: none;
border: none; }
.reveal .roll span:after {
color: #fff;
background: #d08a1d; }
/*********************************************
* IMAGES
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
border: 4px solid #eee;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
border-color: #e7ad52;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls {
color: #e7ad52; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2);
color: #e7ad52; }
.reveal .progress span {
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #111; } }

273
css/theme/serif.css Normal file
View File

@ -0,0 +1,273 @@
/**
* A simple theme for reveal.js presentations, similar
* to the default theme. The accent color is brown.
*
* This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
*/
.reveal a {
line-height: 1.3em; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
background: #F0F1EB;
background-color: #F0F1EB; }
.reveal {
font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
font-size: 40px;
font-weight: normal;
color: #000; }
::selection {
color: #fff;
background: #26351C;
text-shadow: none; }
::-moz-selection {
color: #fff;
background: #26351C;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
/*********************************************
* HEADERS
*********************************************/
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
margin: 0 0 20px 0;
color: #383D3D;
font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
font-weight: normal;
line-height: 1.2;
letter-spacing: normal;
text-transform: none;
text-shadow: none;
word-wrap: break-word; }
.reveal h1 {
font-size: 3.77em; }
.reveal h2 {
font-size: 2.11em; }
.reveal h3 {
font-size: 1.55em; }
.reveal h4 {
font-size: 1em; }
.reveal h1 {
text-shadow: none; }
/*********************************************
* OTHER
*********************************************/
.reveal p {
margin: 20px 0;
line-height: 1.3; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
.reveal iframe {
max-width: 95%;
max-height: 95%; }
.reveal strong,
.reveal b {
font-weight: bold; }
.reveal em {
font-style: italic; }
.reveal ol,
.reveal dl,
.reveal ul {
display: inline-block;
text-align: left;
margin: 0 0 0 1em; }
.reveal ol {
list-style-type: decimal; }
.reveal ul {
list-style-type: disc; }
.reveal ul ul {
list-style-type: square; }
.reveal ul ul ul {
list-style-type: circle; }
.reveal ul ul,
.reveal ul ol,
.reveal ol ol,
.reveal ol ul {
display: block;
margin-left: 40px; }
.reveal dt {
font-weight: bold; }
.reveal dd {
margin-left: 40px; }
.reveal blockquote {
display: block;
position: relative;
width: 70%;
margin: 20px auto;
padding: 5px;
font-style: italic;
background: rgba(255, 255, 255, 0.05);
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
.reveal blockquote p:first-child,
.reveal blockquote p:last-child {
display: inline-block; }
.reveal q {
font-style: italic; }
.reveal pre {
display: block;
position: relative;
width: 90%;
margin: 20px auto;
text-align: left;
font-size: 0.55em;
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
.reveal code {
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
padding: 5px;
overflow: auto;
max-height: 400px;
word-wrap: normal; }
.reveal table {
margin: auto;
border-collapse: collapse;
border-spacing: 0; }
.reveal table th {
font-weight: bold; }
.reveal table th,
.reveal table td {
text-align: left;
padding: 0.2em 0.5em 0.2em 0.5em;
border-bottom: 1px solid; }
.reveal table th[align="center"],
.reveal table td[align="center"] {
text-align: center; }
.reveal table th[align="right"],
.reveal table td[align="right"] {
text-align: right; }
.reveal table tbody tr:last-child th,
.reveal table tbody tr:last-child td {
border-bottom: none; }
.reveal sup {
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
font-size: 0.6em;
line-height: 1.2em;
vertical-align: top; }
.reveal small * {
vertical-align: top; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #51483D;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
color: #8b7c69;
text-shadow: none;
border: none; }
.reveal .roll span:after {
color: #fff;
background: #25211c; }
/*********************************************
* IMAGES
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
border: 4px solid #000;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
border-color: #51483D;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls {
color: #51483D; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2);
color: #51483D; }
.reveal .progress span {
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #F0F1EB; } }

276
css/theme/simple.css Normal file
View File

@ -0,0 +1,276 @@
/**
* A simple theme for reveal.js presentations, similar
* to the default theme. The accent color is darkblue.
*
* This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
* reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
*/
@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
section.has-dark-background, section.has-dark-background h1, section.has-dark-background h2, section.has-dark-background h3, section.has-dark-background h4, section.has-dark-background h5, section.has-dark-background h6 {
color: #fff; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
background: #fff;
background-color: #fff; }
.reveal {
font-family: "Lato", sans-serif;
font-size: 40px;
font-weight: normal;
color: #000; }
::selection {
color: #fff;
background: rgba(0, 0, 0, 0.99);
text-shadow: none; }
::-moz-selection {
color: #fff;
background: rgba(0, 0, 0, 0.99);
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
/*********************************************
* HEADERS
*********************************************/
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
margin: 0 0 20px 0;
color: #000;
font-family: "News Cycle", Impact, sans-serif;
font-weight: normal;
line-height: 1.2;
letter-spacing: normal;
text-transform: none;
text-shadow: none;
word-wrap: break-word; }
.reveal h1 {
font-size: 3.77em; }
.reveal h2 {
font-size: 2.11em; }
.reveal h3 {
font-size: 1.55em; }
.reveal h4 {
font-size: 1em; }
.reveal h1 {
text-shadow: none; }
/*********************************************
* OTHER
*********************************************/
.reveal p {
margin: 20px 0;
line-height: 1.3; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
.reveal iframe {
max-width: 95%;
max-height: 95%; }
.reveal strong,
.reveal b {
font-weight: bold; }
.reveal em {
font-style: italic; }
.reveal ol,
.reveal dl,
.reveal ul {
display: inline-block;
text-align: left;
margin: 0 0 0 1em; }
.reveal ol {
list-style-type: decimal; }
.reveal ul {
list-style-type: disc; }
.reveal ul ul {
list-style-type: square; }
.reveal ul ul ul {
list-style-type: circle; }
.reveal ul ul,
.reveal ul ol,
.reveal ol ol,
.reveal ol ul {
display: block;
margin-left: 40px; }
.reveal dt {
font-weight: bold; }
.reveal dd {
margin-left: 40px; }
.reveal blockquote {
display: block;
position: relative;
width: 70%;
margin: 20px auto;
padding: 5px;
font-style: italic;
background: rgba(255, 255, 255, 0.05);
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
.reveal blockquote p:first-child,
.reveal blockquote p:last-child {
display: inline-block; }
.reveal q {
font-style: italic; }
.reveal pre {
display: block;
position: relative;
width: 90%;
margin: 20px auto;
text-align: left;
font-size: 0.55em;
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
.reveal code {
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
padding: 5px;
overflow: auto;
max-height: 400px;
word-wrap: normal; }
.reveal table {
margin: auto;
border-collapse: collapse;
border-spacing: 0; }
.reveal table th {
font-weight: bold; }
.reveal table th,
.reveal table td {
text-align: left;
padding: 0.2em 0.5em 0.2em 0.5em;
border-bottom: 1px solid; }
.reveal table th[align="center"],
.reveal table td[align="center"] {
text-align: center; }
.reveal table th[align="right"],
.reveal table td[align="right"] {
text-align: right; }
.reveal table tbody tr:last-child th,
.reveal table tbody tr:last-child td {
border-bottom: none; }
.reveal sup {
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
font-size: 0.6em;
line-height: 1.2em;
vertical-align: top; }
.reveal small * {
vertical-align: top; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #00008B;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
color: #0000f1;
text-shadow: none;
border: none; }
.reveal .roll span:after {
color: #fff;
background: #00003f; }
/*********************************************
* IMAGES
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
border: 4px solid #000;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
border-color: #00008B;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls {
color: #00008B; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2);
color: #00008B; }
.reveal .progress span {
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #fff; } }

280
css/theme/sky.css Normal file
View File

@ -0,0 +1,280 @@
/**
* Sky theme for reveal.js.
*
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
*/
@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic);
@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700);
.reveal a {
line-height: 1.3em; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
background: #add9e4;
background: -moz-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #f7fbfc), color-stop(100%, #add9e4));
background: -webkit-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
background: -o-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
background: -ms-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
background: radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
background-color: #f7fbfc; }
.reveal {
font-family: "Open Sans", sans-serif;
font-size: 40px;
font-weight: normal;
color: #333; }
::selection {
color: #fff;
background: #134674;
text-shadow: none; }
::-moz-selection {
color: #fff;
background: #134674;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
/*********************************************
* HEADERS
*********************************************/
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
margin: 0 0 20px 0;
color: #333;
font-family: "Quicksand", sans-serif;
font-weight: normal;
line-height: 1.2;
letter-spacing: -0.08em;
text-transform: uppercase;
text-shadow: none;
word-wrap: break-word; }
.reveal h1 {
font-size: 3.77em; }
.reveal h2 {
font-size: 2.11em; }
.reveal h3 {
font-size: 1.55em; }
.reveal h4 {
font-size: 1em; }
.reveal h1 {
text-shadow: none; }
/*********************************************
* OTHER
*********************************************/
.reveal p {
margin: 20px 0;
line-height: 1.3; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
.reveal iframe {
max-width: 95%;
max-height: 95%; }
.reveal strong,
.reveal b {
font-weight: bold; }
.reveal em {
font-style: italic; }
.reveal ol,
.reveal dl,
.reveal ul {
display: inline-block;
text-align: left;
margin: 0 0 0 1em; }
.reveal ol {
list-style-type: decimal; }
.reveal ul {
list-style-type: disc; }
.reveal ul ul {
list-style-type: square; }
.reveal ul ul ul {
list-style-type: circle; }
.reveal ul ul,
.reveal ul ol,
.reveal ol ol,
.reveal ol ul {
display: block;
margin-left: 40px; }
.reveal dt {
font-weight: bold; }
.reveal dd {
margin-left: 40px; }
.reveal blockquote {
display: block;
position: relative;
width: 70%;
margin: 20px auto;
padding: 5px;
font-style: italic;
background: rgba(255, 255, 255, 0.05);
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
.reveal blockquote p:first-child,
.reveal blockquote p:last-child {
display: inline-block; }
.reveal q {
font-style: italic; }
.reveal pre {
display: block;
position: relative;
width: 90%;
margin: 20px auto;
text-align: left;
font-size: 0.55em;
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
.reveal code {
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
padding: 5px;
overflow: auto;
max-height: 400px;
word-wrap: normal; }
.reveal table {
margin: auto;
border-collapse: collapse;
border-spacing: 0; }
.reveal table th {
font-weight: bold; }
.reveal table th,
.reveal table td {
text-align: left;
padding: 0.2em 0.5em 0.2em 0.5em;
border-bottom: 1px solid; }
.reveal table th[align="center"],
.reveal table td[align="center"] {
text-align: center; }
.reveal table th[align="right"],
.reveal table td[align="right"] {
text-align: right; }
.reveal table tbody tr:last-child th,
.reveal table tbody tr:last-child td {
border-bottom: none; }
.reveal sup {
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
font-size: 0.6em;
line-height: 1.2em;
vertical-align: top; }
.reveal small * {
vertical-align: top; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #3b759e;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
color: #74a7cb;
text-shadow: none;
border: none; }
.reveal .roll span:after {
color: #fff;
background: #264c66; }
/*********************************************
* IMAGES
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
border: 4px solid #333;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
border-color: #3b759e;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls {
color: #3b759e; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2);
color: #3b759e; }
.reveal .progress span {
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #f7fbfc; } }

277
css/theme/solarized.css Normal file
View File

@ -0,0 +1,277 @@
/**
* Solarized Light theme for reveal.js.
* Author: Achim Staebler
*/
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
/**
* Solarized colors by Ethan Schoonover
*/
html * {
color-profile: sRGB;
rendering-intent: auto; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
background: #fdf6e3;
background-color: #fdf6e3; }
.reveal {
font-family: "Lato", sans-serif;
font-size: 40px;
font-weight: normal;
color: #657b83; }
::selection {
color: #fff;
background: #d33682;
text-shadow: none; }
::-moz-selection {
color: #fff;
background: #d33682;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
/*********************************************
* HEADERS
*********************************************/
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
margin: 0 0 20px 0;
color: #586e75;
font-family: "League Gothic", Impact, sans-serif;
font-weight: normal;
line-height: 1.2;
letter-spacing: normal;
text-transform: uppercase;
text-shadow: none;
word-wrap: break-word; }
.reveal h1 {
font-size: 3.77em; }
.reveal h2 {
font-size: 2.11em; }
.reveal h3 {
font-size: 1.55em; }
.reveal h4 {
font-size: 1em; }
.reveal h1 {
text-shadow: none; }
/*********************************************
* OTHER
*********************************************/
.reveal p {
margin: 20px 0;
line-height: 1.3; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
.reveal iframe {
max-width: 95%;
max-height: 95%; }
.reveal strong,
.reveal b {
font-weight: bold; }
.reveal em {
font-style: italic; }
.reveal ol,
.reveal dl,
.reveal ul {
display: inline-block;
text-align: left;
margin: 0 0 0 1em; }
.reveal ol {
list-style-type: decimal; }
.reveal ul {
list-style-type: disc; }
.reveal ul ul {
list-style-type: square; }
.reveal ul ul ul {
list-style-type: circle; }
.reveal ul ul,
.reveal ul ol,
.reveal ol ol,
.reveal ol ul {
display: block;
margin-left: 40px; }
.reveal dt {
font-weight: bold; }
.reveal dd {
margin-left: 40px; }
.reveal blockquote {
display: block;
position: relative;
width: 70%;
margin: 20px auto;
padding: 5px;
font-style: italic;
background: rgba(255, 255, 255, 0.05);
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
.reveal blockquote p:first-child,
.reveal blockquote p:last-child {
display: inline-block; }
.reveal q {
font-style: italic; }
.reveal pre {
display: block;
position: relative;
width: 90%;
margin: 20px auto;
text-align: left;
font-size: 0.55em;
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
.reveal code {
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
padding: 5px;
overflow: auto;
max-height: 400px;
word-wrap: normal; }
.reveal table {
margin: auto;
border-collapse: collapse;
border-spacing: 0; }
.reveal table th {
font-weight: bold; }
.reveal table th,
.reveal table td {
text-align: left;
padding: 0.2em 0.5em 0.2em 0.5em;
border-bottom: 1px solid; }
.reveal table th[align="center"],
.reveal table td[align="center"] {
text-align: center; }
.reveal table th[align="right"],
.reveal table td[align="right"] {
text-align: right; }
.reveal table tbody tr:last-child th,
.reveal table tbody tr:last-child td {
border-bottom: none; }
.reveal sup {
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
font-size: 0.6em;
line-height: 1.2em;
vertical-align: top; }
.reveal small * {
vertical-align: top; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #268bd2;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
color: #78b9e6;
text-shadow: none;
border: none; }
.reveal .roll span:after {
color: #fff;
background: #1a6091; }
/*********************************************
* IMAGES
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
border: 4px solid #657b83;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
border-color: #268bd2;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls {
color: #268bd2; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2);
color: #268bd2; }
.reveal .progress span {
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #fdf6e3; } }

View File

@ -0,0 +1,39 @@
/**
* Beige theme for reveal.js.
*
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
*/
// Default mixins and settings -----------------
@import "../template/mixins";
@import "../template/settings";
// ---------------------------------------------
// Include theme-specific fonts
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
// Override theme settings (see ../template/settings.scss)
$mainColor: #333;
$headingColor: #333;
$headingTextShadow: none;
$backgroundColor: #f7f3de;
$linkColor: #8b743d;
$linkColorHover: lighten( $linkColor, 20% );
$selectionBackgroundColor: rgba(79, 64, 28, 0.99);
$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
// Background generator
@mixin bodyBackground() {
@include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) );
}
// Theme template ------------------------------
@import "../template/theme";
// ---------------------------------------------

View File

@ -0,0 +1,49 @@
/**
* Black theme for reveal.js. This is the opposite of the 'white' theme.
*
* By Hakim El Hattab, http://hakim.se
*/
// Default mixins and settings -----------------
@import "../template/mixins";
@import "../template/settings";
// ---------------------------------------------
// Include theme-specific fonts
@import url(../../lib/font/source-sans-pro/source-sans-pro.css);
// Override theme settings (see ../template/settings.scss)
$backgroundColor: #222;
$mainColor: #fff;
$headingColor: #fff;
$mainFontSize: 42px;
$mainFont: 'Source Sans Pro', Helvetica, sans-serif;
$headingFont: 'Source Sans Pro', Helvetica, sans-serif;
$headingTextShadow: none;
$headingLetterSpacing: normal;
$headingTextTransform: uppercase;
$headingFontWeight: 600;
$linkColor: #42affa;
$linkColorHover: lighten( $linkColor, 15% );
$selectionBackgroundColor: lighten( $linkColor, 25% );
$heading1Size: 2.5em;
$heading2Size: 1.6em;
$heading3Size: 1.3em;
$heading4Size: 1.0em;
section.has-light-background {
&, h1, h2, h3, h4, h5, h6 {
color: #222;
}
}
// Theme template ------------------------------
@import "../template/theme";
// ---------------------------------------------

View File

@ -0,0 +1,78 @@
/**
* Blood theme for reveal.js
* Author: Walther http://github.com/Walther
*
* Designed to be used with highlight.js theme
* "monokai_sublime.css" available from
* https://github.com/isagalaev/highlight.js/
*
* For other themes, change $codeBackground accordingly.
*
*/
// Default mixins and settings -----------------
@import "../template/mixins";
@import "../template/settings";
// ---------------------------------------------
// Include theme-specific fonts
@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic);
// Colors used in the theme
$blood: #a23;
$coal: #222;
$codeBackground: #23241f;
$backgroundColor: $coal;
// Main text
$mainFont: Ubuntu, 'sans-serif';
$mainColor: #eee;
// Headings
$headingFont: Ubuntu, 'sans-serif';
$headingTextShadow: 2px 2px 2px $coal;
// h1 shadow, borrowed humbly from
// (c) Default theme by Hakim El Hattab
$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
// Links
$linkColor: $blood;
$linkColorHover: lighten( $linkColor, 20% );
// Text selection
$selectionBackgroundColor: $blood;
$selectionColor: #fff;
// Theme template ------------------------------
@import "../template/theme";
// ---------------------------------------------
// some overrides after theme template import
.reveal p {
font-weight: 300;
text-shadow: 1px 1px $coal;
}
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
font-weight: 700;
}
.reveal p code {
background-color: $codeBackground;
display: inline-block;
border-radius: 7px;
}
.reveal small code {
vertical-align: baseline;
}

View File

@ -0,0 +1,34 @@
/**
* League theme for reveal.js.
*
* This was the default theme pre-3.0.0.
*
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
*/
// Default mixins and settings -----------------
@import "../template/mixins";
@import "../template/settings";
// ---------------------------------------------
// Include theme-specific fonts
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
// Override theme settings (see ../template/settings.scss)
$headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2);
$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
// Background generator
@mixin bodyBackground() {
@include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) );
}
// Theme template ------------------------------
@import "../template/theme";
// ---------------------------------------------

View File

@ -0,0 +1,57 @@
/**
* Solarized Dark theme for reveal.js.
* Author: Achim Staebler
*/
// Default mixins and settings -----------------
@import "../template/mixins";
@import "../template/settings";
// ---------------------------------------------
// Include theme-specific fonts
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
/**
* Solarized colors by Ethan Schoonover
*/
html * {
color-profile: sRGB;
rendering-intent: auto;
}
// Solarized colors
$base03: #002b36;
$base02: #073642;
$base01: #586e75;
$base00: #657b83;
$base0: #839496;
$base1: #93a1a1;
$base2: #eee8d5;
$base3: #fdf6e3;
$yellow: #b58900;
$orange: #cb4b16;
$red: #dc322f;
$magenta: #d33682;
$violet: #6c71c4;
$blue: #268bd2;
$cyan: #2aa198;
$green: #859900;
// Override theme settings (see ../template/settings.scss)
$mainColor: $base1;
$headingColor: $base2;
$headingTextShadow: none;
$backgroundColor: $base03;
$linkColor: $blue;
$linkColorHover: lighten( $linkColor, 20% );
$selectionBackgroundColor: $magenta;
// Theme template ------------------------------
@import "../template/theme";
// ---------------------------------------------

View File

@ -0,0 +1,34 @@
/**
* Black theme for reveal.js.
*
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
*/
// Default mixins and settings -----------------
@import "../template/mixins";
@import "../template/settings";
// ---------------------------------------------
// Include theme-specific fonts
@import url(https://fonts.googleapis.com/css?family=Montserrat:700);
@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic);
// Override theme settings (see ../template/settings.scss)
$backgroundColor: #111;
$mainFont: 'Open Sans', sans-serif;
$linkColor: #e7ad52;
$linkColorHover: lighten( $linkColor, 20% );
$headingFont: 'Montserrat', Impact, sans-serif;
$headingTextShadow: none;
$headingLetterSpacing: -0.03em;
$headingTextTransform: none;
$selectionBackgroundColor: #e7ad52;
// Theme template ------------------------------
@import "../template/theme";
// ---------------------------------------------

View File

@ -0,0 +1,35 @@
/**
* A simple theme for reveal.js presentations, similar
* to the default theme. The accent color is brown.
*
* This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
*/
// Default mixins and settings -----------------
@import "../template/mixins";
@import "../template/settings";
// ---------------------------------------------
// Override theme settings (see ../template/settings.scss)
$mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
$mainColor: #000;
$headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
$headingColor: #383D3D;
$headingTextShadow: none;
$headingTextTransform: none;
$backgroundColor: #F0F1EB;
$linkColor: #51483D;
$linkColorHover: lighten( $linkColor, 20% );
$selectionBackgroundColor: #26351C;
.reveal a {
line-height: 1.3em;
}
// Theme template ------------------------------
@import "../template/theme";
// ---------------------------------------------

View File

@ -0,0 +1,43 @@
/**
* A simple theme for reveal.js presentations, similar
* to the default theme. The accent color is darkblue.
*
* This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
* reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
*/
// Default mixins and settings -----------------
@import "../template/mixins";
@import "../template/settings";
// ---------------------------------------------
// Include theme-specific fonts
@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
// Override theme settings (see ../template/settings.scss)
$mainFont: 'Lato', sans-serif;
$mainColor: #000;
$headingFont: 'News Cycle', Impact, sans-serif;
$headingColor: #000;
$headingTextShadow: none;
$headingTextTransform: none;
$backgroundColor: #fff;
$linkColor: #00008B;
$linkColorHover: lighten( $linkColor, 20% );
$selectionBackgroundColor: rgba(0, 0, 0, 0.99);
section.has-dark-background {
&, h1, h2, h3, h4, h5, h6 {
color: #fff;
}
}
// Theme template ------------------------------
@import "../template/theme";
// ---------------------------------------------

46
css/theme/source/sky.scss Normal file
View File

@ -0,0 +1,46 @@
/**
* Sky theme for reveal.js.
*
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
*/
// Default mixins and settings -----------------
@import "../template/mixins";
@import "../template/settings";
// ---------------------------------------------
// Include theme-specific fonts
@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic);
@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700);
// Override theme settings (see ../template/settings.scss)
$mainFont: 'Open Sans', sans-serif;
$mainColor: #333;
$headingFont: 'Quicksand', sans-serif;
$headingColor: #333;
$headingLetterSpacing: -0.08em;
$headingTextShadow: none;
$backgroundColor: #f7fbfc;
$linkColor: #3b759e;
$linkColorHover: lighten( $linkColor, 20% );
$selectionBackgroundColor: #134674;
// Fix links so they are not cut off
.reveal a {
line-height: 1.3em;
}
// Background generator
@mixin bodyBackground() {
@include radial-gradient( #add9e4, #f7fbfc );
}
// Theme template ------------------------------
@import "../template/theme";
// ---------------------------------------------

View File

@ -0,0 +1,63 @@
/**
* Solarized Light theme for reveal.js.
* Author: Achim Staebler
*/
// Default mixins and settings -----------------
@import "../template/mixins";
@import "../template/settings";
// ---------------------------------------------
// Include theme-specific fonts
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
/**
* Solarized colors by Ethan Schoonover
*/
html * {
color-profile: sRGB;
rendering-intent: auto;
}
// Solarized colors
$base03: #002b36;
$base02: #073642;
$base01: #586e75;
$base00: #657b83;
$base0: #839496;
$base1: #93a1a1;
$base2: #eee8d5;
$base3: #fdf6e3;
$yellow: #b58900;
$orange: #cb4b16;
$red: #dc322f;
$magenta: #d33682;
$violet: #6c71c4;
$blue: #268bd2;
$cyan: #2aa198;
$green: #859900;
// Override theme settings (see ../template/settings.scss)
$mainColor: $base00;
$headingColor: $base01;
$headingTextShadow: none;
$backgroundColor: $base3;
$linkColor: $blue;
$linkColorHover: lighten( $linkColor, 20% );
$selectionBackgroundColor: $magenta;
// Background generator
// @mixin bodyBackground() {
// @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) );
// }
// Theme template ------------------------------
@import "../template/theme";
// ---------------------------------------------

View File

@ -0,0 +1,49 @@
/**
* White theme for reveal.js. This is the opposite of the 'black' theme.
*
* By Hakim El Hattab, http://hakim.se
*/
// Default mixins and settings -----------------
@import "../template/mixins";
@import "../template/settings";
// ---------------------------------------------
// Include theme-specific fonts
@import url(../../lib/font/source-sans-pro/source-sans-pro.css);
// Override theme settings (see ../template/settings.scss)
$backgroundColor: #fff;
$mainColor: #222;
$headingColor: #222;
$mainFontSize: 42px;
$mainFont: 'Source Sans Pro', Helvetica, sans-serif;
$headingFont: 'Source Sans Pro', Helvetica, sans-serif;
$headingTextShadow: none;
$headingLetterSpacing: normal;
$headingTextTransform: uppercase;
$headingFontWeight: 600;
$linkColor: #2a76dd;
$linkColorHover: lighten( $linkColor, 15% );
$selectionBackgroundColor: lighten( $linkColor, 25% );
$heading1Size: 2.5em;
$heading2Size: 1.6em;
$heading3Size: 1.3em;
$heading4Size: 1.0em;
section.has-dark-background {
&, h1, h2, h3, h4, h5, h6 {
color: #fff;
}
}
// Theme template ------------------------------
@import "../template/theme";
// ---------------------------------------------

View File

@ -0,0 +1,29 @@
@mixin vertical-gradient( $top, $bottom ) {
background: $top;
background: -moz-linear-gradient( top, $top 0%, $bottom 100% );
background: -webkit-gradient( linear, left top, left bottom, color-stop(0%,$top), color-stop(100%,$bottom) );
background: -webkit-linear-gradient( top, $top 0%, $bottom 100% );
background: -o-linear-gradient( top, $top 0%, $bottom 100% );
background: -ms-linear-gradient( top, $top 0%, $bottom 100% );
background: linear-gradient( top, $top 0%, $bottom 100% );
}
@mixin horizontal-gradient( $top, $bottom ) {
background: $top;
background: -moz-linear-gradient( left, $top 0%, $bottom 100% );
background: -webkit-gradient( linear, left top, right top, color-stop(0%,$top), color-stop(100%,$bottom) );
background: -webkit-linear-gradient( left, $top 0%, $bottom 100% );
background: -o-linear-gradient( left, $top 0%, $bottom 100% );
background: -ms-linear-gradient( left, $top 0%, $bottom 100% );
background: linear-gradient( left, $top 0%, $bottom 100% );
}
@mixin radial-gradient( $outer, $inner, $type: circle ) {
background: $outer;
background: -moz-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
background: -webkit-gradient( radial, center center, 0px, center center, 100%, color-stop(0%,$inner), color-stop(100%,$outer) );
background: -webkit-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
background: -o-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
background: -ms-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
background: radial-gradient( center, $type cover, $inner 0%, $outer 100% );
}

View File

@ -0,0 +1,43 @@
// Base settings for all themes that can optionally be
// overridden by the super-theme
// Background of the presentation
$backgroundColor: #2b2b2b;
// Primary/body text
$mainFont: 'Lato', sans-serif;
$mainFontSize: 40px;
$mainColor: #eee;
// Vertical spacing between blocks of text
$blockMargin: 20px;
// Headings
$headingMargin: 0 0 $blockMargin 0;
$headingFont: 'League Gothic', Impact, sans-serif;
$headingColor: #eee;
$headingLineHeight: 1.2;
$headingLetterSpacing: normal;
$headingTextTransform: uppercase;
$headingTextShadow: none;
$headingFontWeight: normal;
$heading1TextShadow: $headingTextShadow;
$heading1Size: 3.77em;
$heading2Size: 2.11em;
$heading3Size: 1.55em;
$heading4Size: 1.00em;
// Links and actions
$linkColor: #13DAEC;
$linkColorHover: lighten( $linkColor, 20% );
// Text selection
$selectionBackgroundColor: #FF5E99;
$selectionColor: #fff;
// Generates the presentation background, can be overridden
// to return a background image or gradient
@mixin bodyBackground() {
background: $backgroundColor;
}

View File

@ -0,0 +1,325 @@
// Base theme template for reveal.js
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
@include bodyBackground();
background-color: $backgroundColor;
}
.reveal {
font-family: $mainFont;
font-size: $mainFontSize;
font-weight: normal;
color: $mainColor;
}
::selection {
color: $selectionColor;
background: $selectionBackgroundColor;
text-shadow: none;
}
::-moz-selection {
color: $selectionColor;
background: $selectionBackgroundColor;
text-shadow: none;
}
.reveal .slides section,
.reveal .slides section>section {
line-height: 1.3;
font-weight: inherit;
}
/*********************************************
* HEADERS
*********************************************/
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
margin: $headingMargin;
color: $headingColor;
font-family: $headingFont;
font-weight: $headingFontWeight;
line-height: $headingLineHeight;
letter-spacing: $headingLetterSpacing;
text-transform: $headingTextTransform;
text-shadow: $headingTextShadow;
word-wrap: break-word;
}
.reveal h1 {font-size: $heading1Size; }
.reveal h2 {font-size: $heading2Size; }
.reveal h3 {font-size: $heading3Size; }
.reveal h4 {font-size: $heading4Size; }
.reveal h1 {
text-shadow: $heading1TextShadow;
}
/*********************************************
* OTHER
*********************************************/
.reveal p {
margin: $blockMargin 0;
line-height: 1.3;
}
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
.reveal iframe {
max-width: 95%;
max-height: 95%;
}
.reveal strong,
.reveal b {
font-weight: bold;
}
.reveal em {
font-style: italic;
}
.reveal ol,
.reveal dl,
.reveal ul {
display: inline-block;
text-align: left;
margin: 0 0 0 1em;
}
.reveal ol {
list-style-type: decimal;
}
.reveal ul {
list-style-type: disc;
}
.reveal ul ul {
list-style-type: square;
}
.reveal ul ul ul {
list-style-type: circle;
}
.reveal ul ul,
.reveal ul ol,
.reveal ol ol,
.reveal ol ul {
display: block;
margin-left: 40px;
}
.reveal dt {
font-weight: bold;
}
.reveal dd {
margin-left: 40px;
}
.reveal blockquote {
display: block;
position: relative;
width: 70%;
margin: $blockMargin auto;
padding: 5px;
font-style: italic;
background: rgba(255, 255, 255, 0.05);
box-shadow: 0px 0px 2px rgba(0,0,0,0.2);
}
.reveal blockquote p:first-child,
.reveal blockquote p:last-child {
display: inline-block;
}
.reveal q {
font-style: italic;
}
.reveal pre {
display: block;
position: relative;
width: 90%;
margin: $blockMargin auto;
text-align: left;
font-size: 0.55em;
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0,0,0,0.3);
}
.reveal code {
font-family: monospace;
text-transform: none;
}
.reveal pre code {
display: block;
padding: 5px;
overflow: auto;
max-height: 400px;
word-wrap: normal;
}
.reveal table {
margin: auto;
border-collapse: collapse;
border-spacing: 0;
}
.reveal table th {
font-weight: bold;
}
.reveal table th,
.reveal table td {
text-align: left;
padding: 0.2em 0.5em 0.2em 0.5em;
border-bottom: 1px solid;
}
.reveal table th[align="center"],
.reveal table td[align="center"] {
text-align: center;
}
.reveal table th[align="right"],
.reveal table td[align="right"] {
text-align: right;
}
.reveal table tbody tr:last-child th,
.reveal table tbody tr:last-child td {
border-bottom: none;
}
.reveal sup {
vertical-align: super;
font-size: smaller;
}
.reveal sub {
vertical-align: sub;
font-size: smaller;
}
.reveal small {
display: inline-block;
font-size: 0.6em;
line-height: 1.2em;
vertical-align: top;
}
.reveal small * {
vertical-align: top;
}
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: $linkColor;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease;
}
.reveal a:hover {
color: $linkColorHover;
text-shadow: none;
border: none;
}
.reveal .roll span:after {
color: #fff;
background: darken( $linkColor, 15% );
}
/*********************************************
* IMAGES
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255,255,255,0.12);
border: 4px solid $mainColor;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
}
.reveal section img.plain {
border: 0;
box-shadow: none;
}
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear;
}
.reveal a:hover img {
background: rgba(255,255,255,0.2);
border-color: $linkColor;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
}
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls {
color: $linkColor;
}
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0,0,0,0.2);
color: $linkColor;
}
.reveal .progress span {
-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
}
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: $backgroundColor;
}
}

273
css/theme/white.css Normal file
View File

@ -0,0 +1,273 @@
/**
* White theme for reveal.js. This is the opposite of the 'black' theme.
*
* By Hakim El Hattab, http://hakim.se
*/
@import url(../../lib/font/source-sans-pro/source-sans-pro.css);
section.has-dark-background, section.has-dark-background h1, section.has-dark-background h2, section.has-dark-background h3, section.has-dark-background h4, section.has-dark-background h5, section.has-dark-background h6 {
color: #fff; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
background: #fff;
background-color: #fff; }
.reveal {
font-family: "Source Sans Pro", Helvetica, sans-serif;
font-size: 42px;
font-weight: normal;
color: #222; }
::selection {
color: #fff;
background: #98bdef;
text-shadow: none; }
::-moz-selection {
color: #fff;
background: #98bdef;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
/*********************************************
* HEADERS
*********************************************/
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
margin: 0 0 20px 0;
color: #222;
font-family: "Source Sans Pro", Helvetica, sans-serif;
font-weight: 600;
line-height: 1.2;
letter-spacing: normal;
text-transform: uppercase;
text-shadow: none;
word-wrap: break-word; }
.reveal h1 {
font-size: 2.5em; }
.reveal h2 {
font-size: 1.6em; }
.reveal h3 {
font-size: 1.3em; }
.reveal h4 {
font-size: 1em; }
.reveal h1 {
text-shadow: none; }
/*********************************************
* OTHER
*********************************************/
.reveal p {
margin: 20px 0;
line-height: 1.3; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
.reveal iframe {
max-width: 95%;
max-height: 95%; }
.reveal strong,
.reveal b {
font-weight: bold; }
.reveal em {
font-style: italic; }
.reveal ol,
.reveal dl,
.reveal ul {
display: inline-block;
text-align: left;
margin: 0 0 0 1em; }
.reveal ol {
list-style-type: decimal; }
.reveal ul {
list-style-type: disc; }
.reveal ul ul {
list-style-type: square; }
.reveal ul ul ul {
list-style-type: circle; }
.reveal ul ul,
.reveal ul ol,
.reveal ol ol,
.reveal ol ul {
display: block;
margin-left: 40px; }
.reveal dt {
font-weight: bold; }
.reveal dd {
margin-left: 40px; }
.reveal blockquote {
display: block;
position: relative;
width: 70%;
margin: 20px auto;
padding: 5px;
font-style: italic;
background: rgba(255, 255, 255, 0.05);
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
.reveal blockquote p:first-child,
.reveal blockquote p:last-child {
display: inline-block; }
.reveal q {
font-style: italic; }
.reveal pre {
display: block;
position: relative;
width: 90%;
margin: 20px auto;
text-align: left;
font-size: 0.55em;
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
.reveal code {
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
padding: 5px;
overflow: auto;
max-height: 400px;
word-wrap: normal; }
.reveal table {
margin: auto;
border-collapse: collapse;
border-spacing: 0; }
.reveal table th {
font-weight: bold; }
.reveal table th,
.reveal table td {
text-align: left;
padding: 0.2em 0.5em 0.2em 0.5em;
border-bottom: 1px solid; }
.reveal table th[align="center"],
.reveal table td[align="center"] {
text-align: center; }
.reveal table th[align="right"],
.reveal table td[align="right"] {
text-align: right; }
.reveal table tbody tr:last-child th,
.reveal table tbody tr:last-child td {
border-bottom: none; }
.reveal sup {
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
font-size: 0.6em;
line-height: 1.2em;
vertical-align: top; }
.reveal small * {
vertical-align: top; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #2a76dd;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
color: #6ca0e8;
text-shadow: none;
border: none; }
.reveal .roll span:after {
color: #fff;
background: #1a53a1; }
/*********************************************
* IMAGES
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
border: 4px solid #222;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
border-color: #2a76dd;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls {
color: #2a76dd; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2);
color: #2a76dd; }
.reveal .progress span {
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #fff; } }

191
index.html Normal file
View File

@ -0,0 +1,191 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Fomu: An FPGA in your USB Port</title>
<meta name="description" content="A framework for easily creating beautiful presentations using HTML">
<meta name="author" content="Sean &quot;xobs&quot; Cross">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="stylesheet" href="css/reveal.css">
<link rel="stylesheet" href="css/theme/solarized.css" id="theme">
<!-- Theme used for syntax highlighting of code -->
<link rel="stylesheet" href="lib/css/zenburn.css">
<!-- Printing and PDF exports -->
<script>
var link = document.createElement('link');
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match(/print-pdf/gi) ? 'css/print/pdf.css' : 'css/print/paper.css';
document.getElementsByTagName('head')[0].appendChild(link);
</script>
<!--[if lt IE 9]>
<script src="lib/js/html5shiv.js"></script>
<![endif]-->
<style>
/*********************************************
* ZOOM REVERSE TRANSITION (i.e. zoom out)
*********************************************/
.reveal .slides section[data-transition=zoomrev],
.reveal.zoomrev .slides section:not([data-transition]) {
transition-timing-function: ease;
}
.reveal .slides > section[data-transition=zoomrev].past,
.reveal .slides > section[data-transition~=zoomrev-out].past,
.reveal.zoomrev .slides > section:not([data-transition]).past {
visibility: hidden;
-webkit-transform: scale(0.2);
transform: scale(0.2);
}
.reveal .slides > section[data-transition=zoomrev].future,
.reveal .slides > section[data-transition~=zoomrev-in].future,
.reveal.zoomrev .slides > section:not([data-transition]).future {
visibility: hidden;
-webkit-transform: scale(16);
transform: scale(16);
}
.reveal .slides > section > section[data-transition=zoomrev].past,
.reveal .slides > section > section[data-transition~=zoomrev-out].past,
.reveal.zoomrev .slides > section > section:not([data-transition]).past {
-webkit-transform: translate(0, 150%);
transform: translate(0, 150%);
}
.reveal .slides > section > section[data-transition=zoomrev].future,
.reveal .slides > section > section[data-transition~=zoomrev-in].future,
.reveal.zoomrev .slides > section > section:not([data-transition]).future {
-webkit-transform: translate(0, -150%);
transform: translate(0, -150%);
}
</style>
</head>
<body>
<!-- Start of main presentation -->
<div class="reveal">
<div class="footer">
<a class="url" href="https://p.xobs.io/td19/">p.xobs.io/td19</a>
<span class="theme">Teardown 2019</span><span class="hashtag"> | #teardown2019</span><span class="twitter"> |
@teardown</span>
</div>
<div class="slides">
<section>
<h2>Fomu: an FPGA in your USB Port</h2>
<img src="img/tomu-fomu-case-superwide.jpg">
<p>
Fomu (with case): an FPGA in your USB port. Crowdfunding now! One week to go. <a href="https://t.xobs.io/fomu">t.xobs.io/fomu</a>
</p>
</section>
<section data-background-image="css/theme/lca2019-title-bg-transparent.svg">
<h1>Fomu: An FPGA in your USB Port</h1>
<h4>A whirlwind introduction to Fomu and FPGAs</h4>
<p align="right">
<small>Sean Cross - <a href="https://xobs.io/">https://xobs.io/</a> - @xobs</small>
</p>
</section>
<section>
<h3>Outline</h3>
<ol>
<li>What is an FPGA?</li>
<li>What is Fomu?</li>
<li>What is this PCB?</li>
<li>
<ul>
<li>Modifications made</li>
<li>Differences to final PCB</li>
</ul>
</li>
<li>Levels of Fomu</li>
<li>
<ol>
<li>Python / Interpreted</li>
<li>RISC-V</li>
<li>Verilog / FPGA</li>
</ol>
</li>
<li>Loading firmware onto Fomu</li>
<li>Blinkenlights</li>
</ol>
</section>
</div>
</div> <!-- class="reveal" -->
<!-- End of main presentation -->
<!-- Start of configuration section -->
<script src="lib/js/head.min.js"></script>
<script src="js/reveal.js"></script>
<script>
var presenter = !!Reveal.getQueryHash().s;
// More info https://github.com/hakimel/reveal.js#configuration
Reveal.initialize({
controls: presenter ? false : true,
progress: true,
history: true,
center: true,
controlsTutorial: presenter ? false : true,
slideNumber: presenter ? null : 'c/t',
// The "normal" size of the presentation, aspect ratio will be preserved
// when the presentation is scaled to fit different resolutions. Can be
// specified using percentage units.
width: 960,
height: 700,
// Factor of the display size that should remain empty around the content
margin: 0.1,
multiplex: {
url: 'https://p.xobs.io/',
id: 'cbd6556886c2825d',
secret: Reveal.getQueryHash().s || null
},
// Bounds for smallest/largest possible scale to apply to content
minScale: 0.02,
maxScale: 5.5,
transition: 'slide', // none/fade/slide/convex/concave/zoom
// More info https://github.com/hakimel/reveal.js#dependencies
dependencies: [
{ src: 'lib/js/classList.js', condition: function () { return !document.body.classList; } },
{ src: 'plugin/markdown/marked.js', condition: function () { return !!document.querySelector('[data-markdown]'); } },
{ src: 'plugin/markdown/markdown.js', condition: function () { return !!document.querySelector('[data-markdown]'); } },
{ src: 'plugin/highlight/highlight.js', async: true, callback: function () { hljs.initHighlightingOnLoad(); } },
{ src: 'plugin/search/search.js', async: true },
{ src: 'plugin/zoom-js/zoom.js', async: true },
{ src: 'plugin/notes/notes.js', async: true },
{ src: 'lib/js/socket.io.js', async: true },
{
src: presenter ?
'plugin/multiplex/master.js' :
'plugin/multiplex/client.js', async: true
},
]
});
</script>
</body>
</html>

5577
js/reveal.js Normal file

File diff suppressed because it is too large Load Diff

80
lib/css/zenburn.css Normal file
View File

@ -0,0 +1,80 @@
/*
Zenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>
based on dark.css by Ivan Sagalaev
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
background: #3f3f3f;
color: #dcdcdc;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-tag {
color: #e3ceab;
}
.hljs-template-tag {
color: #dcdcdc;
}
.hljs-number {
color: #8cd0d3;
}
.hljs-variable,
.hljs-template-variable,
.hljs-attribute {
color: #efdcbc;
}
.hljs-literal {
color: #efefaf;
}
.hljs-subst {
color: #8f8f8f;
}
.hljs-title,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-section,
.hljs-type {
color: #efef8f;
}
.hljs-symbol,
.hljs-bullet,
.hljs-link {
color: #dca3a3;
}
.hljs-deletion,
.hljs-string,
.hljs-built_in,
.hljs-builtin-name {
color: #cc9393;
}
.hljs-addition,
.hljs-comment,
.hljs-quote,
.hljs-meta {
color: #7f9f7f;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}

View File

@ -0,0 +1,2 @@
SIL Open Font License (OFL)
http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL

View File

@ -0,0 +1,10 @@
@font-face {
font-family: 'League Gothic';
src: url('league-gothic.eot');
src: url('league-gothic.eot?#iefix') format('embedded-opentype'),
url('league-gothic.woff') format('woff'),
url('league-gothic.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,45 @@
SIL Open Font License
Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name Source. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
—————————————————————————————-
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
—————————————————————————————-
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
DEFINITIONS
“Font Software” refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
“Reserved Font Name” refers to any names specified as such after the copyright statement(s).
“Original Version” refers to the collection of Font Software components as distributed by the Copyright Holder(s).
“Modified Version” refers to any derivative made by adding to, deleting, or substituting—in part or in whole—any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
“Author” refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,39 @@
@font-face {
font-family: 'Source Sans Pro';
src: url('source-sans-pro-regular.eot');
src: url('source-sans-pro-regular.eot?#iefix') format('embedded-opentype'),
url('source-sans-pro-regular.woff') format('woff'),
url('source-sans-pro-regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Source Sans Pro';
src: url('source-sans-pro-italic.eot');
src: url('source-sans-pro-italic.eot?#iefix') format('embedded-opentype'),
url('source-sans-pro-italic.woff') format('woff'),
url('source-sans-pro-italic.ttf') format('truetype');
font-weight: normal;
font-style: italic;
}
@font-face {
font-family: 'Source Sans Pro';
src: url('source-sans-pro-semibold.eot');
src: url('source-sans-pro-semibold.eot?#iefix') format('embedded-opentype'),
url('source-sans-pro-semibold.woff') format('woff'),
url('source-sans-pro-semibold.ttf') format('truetype');
font-weight: 600;
font-style: normal;
}
@font-face {
font-family: 'Source Sans Pro';
src: url('source-sans-pro-semibolditalic.eot');
src: url('source-sans-pro-semibolditalic.eot?#iefix') format('embedded-opentype'),
url('source-sans-pro-semibolditalic.woff') format('woff'),
url('source-sans-pro-semibolditalic.ttf') format('truetype');
font-weight: 600;
font-style: italic;
}

View File

@ -0,0 +1,2 @@
SIL Open Font License (OFL)
http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL

Binary file not shown.

View File

@ -0,0 +1,333 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<defs >
<font id="SpaceMono" horiz-adv-x="612" ><font-face
font-family="Space Mono"
units-per-em="1000"
panose-1="2 0 5 9 4 0 0 2 0 4"
ascent="1120"
descent="-361"
alphabetic="0" />
<glyph unicode=" " glyph-name="space" />
<glyph unicode="!" glyph-name="exclam" d="M236 56Q236 85 256 105T306 126Q335 126 355 106T376 56Q376 27 356 7T306 -14Q277 -14 257 6T236 56ZM346 700V186H266V700H346Z" />
<glyph unicode="&quot;" glyph-name="quotedbl" d="M327 644Q327 673 347 693T397 714Q426 714 446 694T467 644Q467 622 455 605T424 579V468H370V579Q351 587 339 604T327 644ZM145 644Q145 673 165 693T215 714Q244 714 264 694T285 644Q285 622 273 605T242
579V468H188V579Q169 587 157 604T145 644Z" />
<glyph unicode="#" glyph-name="numbersign" d="M360 102V224H252V102H180V224H70V296H180V404H70V476H180V598H252V476H360V598H432V476H542V404H432V296H542V224H432V102H360ZM360 404H252V296H360V404Z" />
<glyph unicode="$" glyph-name="dollar" d="M334 608Q369 602 397 588T446 552T477 506T488 452V434H412V446Q412 479 391 502T334 534V391Q417 381 460 346T504 248V242Q504 175 458 135T334 89V28H262V91Q218 98 187 115T135 157T104 210T94 268V292H170V280Q170
232 194 203T262 164V327Q187 337 148 370T108 464V470Q108 502 120 526T154 568T203 596T262 610V672H334V608ZM426 242Q426 277 404 294T334 319V161Q377 166 401 187T426 242ZM186 470Q186 442 202 425T262 399V538Q230 533 208 516T186 470Z" />
<glyph unicode="%" glyph-name="percent" d="M346 556Q346 520 334 493T302 446T255 416T199 406Q170 406 144 416T97 445T64 492T52 556Q52 592 64 619T96 666T143 696T199 706Q228 706 254 696T301 667T334 620T346 556ZM199 460Q238 460 262 486T286 556Q286
599 262 625T199 652Q160 652 136 626T112 556Q112 508 136 484T199 460ZM561 144Q561 108 549 81T517 34T470 4T414 -6Q385 -6 359 4T312 33T279 80T267 144Q267 180 279 207T311 254T358 284T414 294Q443 294 469 284T516 255T549 208T561 144ZM414 48Q453 48
477 74T501 144Q501 187 477 213T414 240Q375 240 351 214T327 144Q327 96 351 72T414 48ZM531 494L555 448L82 207L58 253L531 494Z" />
<glyph unicode="&amp;" glyph-name="ampersand" d="M580 312H483V0H259Q209 0 170 14T105 52T66 110T52 183V195Q52 252 86 291T170 345V357Q120 370 86 409T52 506V518Q52 557 65 590T105 648T170 686T259 700H387V622H265Q206 622 169 593T132 512V506Q132 452
167 421T262 390H399V496H483V390H580V312ZM399 78V312H262Q202 312 167 281T132 195V189Q132 137 169 108T265 78H399Z" />
<glyph unicode="&apos;" glyph-name="quotesingle" d="M236 644Q236 673 256 693T306 714Q335 714 355 694T376 644Q376 622 364 605T333 579V468H279V579Q260 587 248 604T236 644Z" />
<glyph unicode="(" glyph-name="parenleft" d="M546 -82V-156H510Q440 -156 376 -130T263 -55T185 65T156 224V476Q156 564 185 634T263 754T376 830T510 856H546V782H510Q456 782 406 761T318 699T257 602T234 472V228Q234 156 257 99T318 1T406 -60T510 -82H546Z" />
<glyph unicode=")" glyph-name="parenright" d="M102 -82Q156 -82 206 -61T294 1T355 98T378 228V472Q378 544 355 601T294 699T206 760T102 782H66V856H102Q172 856 236 830T349 755T427 635T456 476V224Q456 135 427 65T349 -54T236 -130T102 -156H66V-82H102Z" />
<glyph unicode="*" glyph-name="asterisk" d="M507 500L419 412L369 384L374 372L419 386H554V314H419L374 328L369 316L419 288L507 200L456 149L368 237L340 287L328 282L342 237V102H270V237L284 282L272 287L244 237L156 149L105 200L193 288L243 316L238
328L193 314H58V386H193L238 372L243 384L193 412L105 500L156 551L244 463L272 413L284 418L270 463V598H342V463L328 418L340 413L368 463L456 551L507 500Z" />
<glyph unicode="+" glyph-name="plus" d="M97 386H270V559H342V386H515V314H342V141H270V314H97V386Z" />
<glyph unicode="," glyph-name="comma" d="M236 56Q236 85 256 105T306 126Q335 126 355 106T376 56V-42Q376 -76 355 -98T299 -120H248V-66H295Q322 -66 322 -36V-11Q314 -14 305 -14Q277 -14 257 6T236 56Z" />
<glyph unicode="-" glyph-name="hyphen" d="M156 296H456V224H156V296Z" />
<glyph unicode="." glyph-name="period" d="M236 56Q236 85 256 105T306 126Q335 126 355 106T376 56Q376 27 356 7T306 -14Q277 -14 257 6T236 56Z" />
<glyph unicode="/" glyph-name="slash" d="M417 806L487 784L196 -106L125 -84L417 806Z" />
<glyph unicode="0" glyph-name="zero" d="M60 428Q60 564 125 639T306 714Q422 714 487 639T552 428V272Q552 132 487 59T306 -14Q190 -14 125 59T60 272V428ZM306 62Q387 62 427 118T468 278V422Q468 470 458 509T428 577T377 622T306 638Q265 638 235 622T185
578T154 510T144 422V278Q144 175 184 119T306 62ZM242 350Q242 376 261 395T306 414Q332 414 351 395T370 350Q370 324 351 305T306 286Q280 286 261 305T242 350Z" />
<glyph unicode="1" glyph-name="one" d="M269 78V663H257L142 400H59V406L190 700H353V78H551V0H71V78H269Z" />
<glyph unicode="2" glyph-name="two" d="M544 78V0H70V120Q70 168 86 203T131 264T203 307T298 336Q387 356 426 393T466 484V490Q466 517 457 543T429 590T381 623T310 636Q233 636 191 589T148 464V420H64V470Q64 518 80 562T127 640T204 694T310 714Q371 714
416 696T491 647T535 578T550 499V481Q550 401 500 345T340 264Q244 243 199 209T154 108V78H544Z" />
<glyph unicode="3" glyph-name="three" d="M237 348V464L465 610V622H69V700H537V572L309 426V414H349Q389 414 426 401T491 363T537 302T555 217V199Q555 154 537 115T487 48T412 3T317 -14Q258 -14 211 4T131 53T81 127T63 218V272H147V224Q147 186 159 157T194
107T248 75T315 64Q348 64 376 75T426 105T459 151T471 208V214Q471 277 431 312T331 348H237Z" />
<glyph unicode="4" glyph-name="four" d="M294 700H457V210H565V132H457V0H373V132H49V248L294 700ZM121 222V210H373V664H361L121 222Z" />
<glyph unicode="5" glyph-name="five" d="M78 330V700H516V622H160V372H172Q182 392 198 410T235 443T284 465T344 474Q392 474 432 458T502 413T547 343T564 252V234Q564 184 548 140T501 61T424 6T318 -14Q257 -14 210 4T131 54T83 129T66 224V252H150V230Q150
147 196 106T318 64Q358 64 388 78T439 117T470 174T480 242V248Q480 279 470 306T441 353T396 384T338 396Q317 396 300 390T269 375T248 353T236 330H78Z" />
<glyph unicode="6" glyph-name="six" d="M453 496Q453 561 413 600T302 640Q268 640 240 628T191 594T159 540T147 472V368H159Q183 412 227 437T327 462Q375 462 416 447T486 401T532 329T549 232V220Q549 168 531 125T480 51T403 3T306 -14Q254 -14 210 3T133
50T82 123T63 217V472Q63 527 82 572T134 648T210 697T304 714Q354 714 397 699T471 656T519 587T537 496H453ZM306 60Q342 60 371 71T422 104T454 154T465 218V230Q465 265 453 294T420 344T370 376T306 388Q272 388 243 376T193 343T159 294T147 234V215Q147
182 158 154T190 104T240 72T306 60Z" />
<glyph unicode="7" glyph-name="seven" d="M72 700H540V578L245 132Q224 100 213 77T202 30V0H120V36Q120 54 123 70T134 102T153 137T181 180L468 610V622H72V700Z" />
<glyph unicode="8" glyph-name="eight" d="M297 -14Q244 -14 201 0T127 40T80 100T63 176V188Q63 224 74 252T103 301T144 336T193 357V369Q170 376 150 390T115 423T90 466T81 520V532Q81 572 97 605T142 663T212 700T303 714H309Q358 714 399 701T469 663T515
606T531 532V520Q531 491 522 467T498 423T462 390T419 369V357Q444 350 467 336T509 301T538 252T549 188V176Q549 135 533 101T485 41T411 1T315 -14H297ZM312 62Q380 62 422 97T465 188V194Q465 256 422 290T309 324H303Q234 324 191 290T147 194V188Q147 132
189 97T300 62H312ZM306 402Q369 402 408 435T447 518V524Q447 575 409 606T306 638Q242 638 204 607T165 524V518Q165 468 204 435T306 402Z" />
<glyph unicode="9" glyph-name="nine" d="M159 204Q159 139 199 100T310 60Q344 60 372 72T421 106T453 159T465 228V332H453Q430 288 387 263T287 238Q238 238 197 253T126 297T80 369T63 465V477Q63 529 81 572T131 647T208 696T306 714Q359 714 403 697T480
648T531 574T549 480V228Q549 172 531 128T480 52T403 3T308 -14Q257 -14 214 1T140 44T92 113T75 204H159ZM306 640Q270 640 241 628T190 594T158 543T147 479V467Q147 432 159 404T192 355T242 323T306 312Q340 312 369 323T419 355T453 403T465 463V482Q465
515 454 544T422 594T372 628T306 640Z" />
<glyph unicode=":" glyph-name="colon" d="M236 56Q236 85 256 105T306 126Q335 126 355 106T376 56Q376 27 356 7T306 -14Q277 -14 257 6T236 56ZM236 440Q236 469 256 489T306 510Q335 510 355 490T376 440Q376 411 356 391T306 370Q277 370 257 390T236 440Z" />
<glyph unicode=";" glyph-name="semicolon" d="M236 56Q236 85 256 105T306 126Q335 126 355 106T376 56V-42Q376 -76 355 -98T299 -120H248V-66H295Q322 -66 322 -36V-11Q314 -14 305 -14Q277 -14 257 6T236 56ZM236 440Q236 469 256 489T306 510Q335 510 355
490T376 440Q376 411 356 391T306 370Q277 370 257 390T236 440Z" />
<glyph unicode="&lt;" glyph-name="less" d="M97 274V426L515 570V486L127 356V344L515 214V130L97 274Z" />
<glyph unicode="=" glyph-name="equal" d="M97 458H515V386H97V458ZM97 314H515V242H97V314Z" />
<glyph unicode="&gt;" glyph-name="greater" d="M97 130V214L485 344V356L97 486V570L515 426V274L97 130Z" />
<glyph unicode="?" glyph-name="question" d="M352 366Q397 366 426 399T456 486V492Q456 522 446 548T416 593T370 624T310 636Q238 636 197 592T156 476V434H72V482Q72 528 87 570T133 644T208 695T312 714Q362 714 404 697T476 651T523 583T540 501V483Q540
444 527 409T489 347T433 306T362 290H348Q320 290 320 260V186H240V280Q240 318 264 342T326 366H352ZM211 56Q211 85 231 105T281 126Q310 126 330 106T351 56Q351 27 331 7T281 -14Q252 -14 232 6T211 56Z" />
<glyph unicode="@" glyph-name="at" d="M78 510V582H368Q460 582 512 534T564 386V78Q564 44 543 22T487 0H407Q370 0 353 19T336 66H324Q312 28 284 7T208 -14Q171 -14 140 1T87 44T51 112T38 203V221Q38 271 51 311T86 379T140 423T206 438Q252 438 276 421T318
370H330V424H408V102Q408 72 435 72H459Q486 72 486 102V378Q486 443 456 476T360 510H78ZM223 60Q253 60 273 71T306 101T324 147T330 203V221Q330 249 325 275T307 321T274 352T223 364Q198 364 178 353T145 323T124 277T116 221V203Q116 140 144 100T223 60Z"
/>
<glyph unicode="A" glyph-name="A" d="M456 174H156L105 0H15L227 700H385L597 0H507L456 174ZM300 664L179 252H433L312 664H300Z" />
<glyph unicode="B" glyph-name="B" d="M57 78H117V622H57V700H340Q390 700 428 686T493 648T533 591T547 518V506Q547 477 538 453T513 410T476 378T429 357V345Q479 331 513 292T547 195V183Q547 144 534 111T494 53T429 14T340 0H57V78ZM201 78H334Q393 78 430
107T467 189V195Q467 249 432 280T337 312H201V78ZM201 390H337Q397 390 432 421T467 506V512Q467 563 430 592T334 622H201V390Z" />
<glyph unicode="C" glyph-name="C" d="M310 64Q353 64 383 78T433 117T462 173T472 240V252H556V240Q556 187 540 141T493 60T416 6T310 -14Q194 -14 129 59T64 272V428Q64 564 129 639T310 714Q370 714 416 695T493 641T540 560T556 460V448H472V460Q471 494
462 526T433 582T383 621T310 636Q229 636 189 577T148 422V278Q148 175 188 120T310 64Z" />
<glyph unicode="D" glyph-name="D" d="M73 700H303Q433 700 493 638T553 440V260Q553 124 493 62T303 0H73V79H133V622H73V700ZM291 78Q337 78 370 87T426 117T458 175T469 266V434Q469 489 459 525T426 582T371 613T291 622H217V78H291Z" />
<glyph unicode="E" glyph-name="E" d="M94 700H518V622H178V390H512V312H178V78H524V0H94V700Z" />
<glyph unicode="F" glyph-name="F" d="M95 700H525V622H179V390H519V312H179V0H95V700Z" />
<glyph unicode="G" glyph-name="G" d="M239 336H551V0H473V84H461Q444 40 401 13T301 -14Q188 -14 124 59T59 272V428Q59 564 124 639T305 714Q365 714 411 695T488 641T535 560T551 460V448H467V460Q467 494 458 526T429 582T379 621T305 636Q224 636 184 577T143
422V278Q143 175 183 120T307 64Q382 64 424 112T467 246V258H239V336Z" />
<glyph unicode="H" glyph-name="H" d="M73 700H157V390H455V700H539V0H455V312H157V0H73V700Z" />
<glyph unicode="I" glyph-name="I" d="M84 700H528V622H348V78H528V0H84V78H264V622H84V700Z" />
<glyph unicode="J" glyph-name="J" d="M505 210Q505 101 452 44T295 -14Q192 -14 133 43T73 210V264H157V210Q157 144 191 104T295 64Q365 64 393 104T421 210V622H349V700H565V622H505V210Z" />
<glyph unicode="K" glyph-name="K" d="M173 0H89V700H173V390H196L465 700H569V694L279 356V344L581 6V0H475L196 312H173V0Z" />
<glyph unicode="L" glyph-name="L" d="M87 700H171V78H537V0H87V700Z" />
<glyph unicode="M" glyph-name="M" d="M46 700H206L300 36H312L406 700H566V0H488V664H476L382 0H230L136 664H124V0H46V700Z" />
<glyph unicode="N" glyph-name="N" d="M443 36H455V700H539V0H371L169 664H157V0H73V700H241L443 36Z" />
<glyph unicode="O" glyph-name="O" d="M60 428Q60 564 125 639T306 714Q422 714 487 639T552 428V272Q552 132 487 59T306 -14Q190 -14 125 59T60 272V428ZM306 64Q387 64 427 119T468 278V422Q468 518 428 577T306 636Q225 636 185 577T144 422V278Q144 175 184
120T306 64Z" />
<glyph unicode="P" glyph-name="P" d="M169 288V0H85V700H335Q389 700 429 685T495 643T535 583T549 510V480Q549 442 536 407T495 346T428 304T335 288H169ZM169 366H325Q465 366 465 486V504Q465 557 431 589T325 622H169V366Z" />
<glyph unicode="Q" glyph-name="Q" d="M60 428Q60 564 125 639T306 714Q422 714 487 639T552 428V272Q552 144 498 72T345 -12V-54Q345 -84 372 -84H456V-156H344Q310 -156 289 -134T267 -78V-12Q168 0 114 72T60 272V428ZM306 64Q387 64 427 119T468 278V422Q468
518 428 577T306 636Q225 636 185 577T144 422V278Q144 175 184 120T306 64Z" />
<glyph unicode="R" glyph-name="R" d="M525 0H441V234Q441 260 429 274T387 288H169V0H85V700H335Q389 700 429 685T495 643T535 583T549 510V480Q549 441 528 402T461 342V330Q491 325 508 306T525 252V0ZM169 366H325Q396 366 430 396T465 486V504Q465 557 431
589T325 622H169V366Z" />
<glyph unicode="S" glyph-name="S" d="M471 498Q471 532 458 558T421 601T368 627T305 636Q276 636 250 629T204 607T171 573T159 525V519Q159 490 171 470T206 435T265 411T347 394Q457 377 509 330T561 202V190Q561 145 546 108T500 43T424 1T320 -14Q253 -14
202 5T116 59T63 140T45 242V272H129V248Q129 156 179 110T320 64Q398 64 437 98T477 190V196Q477 251 437 280T305 322Q252 329 210 343T137 381T91 438T75 516V528Q75 569 92 603T139 662T212 700T306 714Q365 714 411 697T490 652T538 585T555 504V462H471V498Z"
/>
<glyph unicode="T" glyph-name="T" d="M60 700H552V622H348V0H264V622H60V700Z" />
<glyph unicode="U" glyph-name="U" d="M150 700V236Q150 151 189 108T306 64Q383 64 422 107T462 236V700H546V236Q546 114 482 50T306 -14Q194 -14 130 50T66 236V700H150Z" />
<glyph unicode="V" glyph-name="V" d="M27 700H117L300 36H312L495 700H585L387 0H225L27 700Z" />
<glyph unicode="W" glyph-name="W" d="M530 0H377L312 664H300L235 0H82L11 700H87L154 36H166L229 700H383L446 36H458L525 700H601L530 0Z" />
<glyph unicode="X" glyph-name="X" d="M140 700L297 390H315L472 700H564L389 357V345L564 0H472L315 312H297L140 0H48L223 345V357L48 700H140Z" />
<glyph unicode="Y" glyph-name="Y" d="M264 246H246L27 700H121L300 318H312L491 700H585L366 246H348V0H264V246Z" />
<glyph unicode="Z" glyph-name="Z" d="M77 700H545V574L125 90V78H557V0H53V126L473 610V622H77V700Z" />
<glyph unicode="[" glyph-name="bracketleft" d="M264 778Q264 812 285 834T341 856H438V784H369Q342 784 342 754V-54Q342 -84 369 -84H438V-156H341Q307 -156 286 -134T264 -78V778Z" />
<glyph unicode="\" glyph-name="backslash" d="M487 -84L416 -106L125 784L195 806L487 -84Z" />
<glyph unicode="]" glyph-name="bracketright" d="M348 -78Q348 -112 327 -134T271 -156H174V-84H243Q270 -84 270 -54V754Q270 784 243 784H174V856H271Q305 856 326 834T348 778V-78Z" />
<glyph unicode="^" glyph-name="asciicircum" d="M540 424H448L312 670H300L164 424H72L230 700H382L540 424Z" />
<glyph unicode="_" glyph-name="underscore" d="M73 -48H539V-120H73V-48Z" />
<glyph unicode="`" glyph-name="grave" d="M316 688L382 570H310L226 688H316Z" />
<glyph unicode="a" glyph-name="a" d="M447 84H435Q411 34 369 10T279 -14Q230 -14 188 2T115 51T65 131T47 240V256Q47 317 65 364T114 443T188 493T277 510Q328 510 369 488T435 418H447V496H525V102Q525 72 552 72H577V0H524Q490 0 469 22T447 78V84ZM287 60Q322
60 351 73T402 110T435 167T447 242V254Q447 294 435 327T402 385T351 422T287 436Q252 436 223 423T173 387T139 330T127 256V240Q127 155 171 108T287 60Z" />
<glyph unicode="b" glyph-name="b" d="M147 0H69V700H147V418H159Q185 463 231 486T331 510Q377 510 418 493T490 444T540 365T559 258V238Q559 177 541 130T492 51T418 3T329 -14Q305 -14 280 -9T233 8T191 36T159 76H147V0ZM313 60Q349 60 379 72T431 108T466
164T479 238V258Q479 298 467 330T432 386T379 423T313 436Q278 436 248 423T196 385T160 328T147 254V242Q147 201 160 168T195 110T248 73T313 60Z" />
<glyph unicode="c" glyph-name="c" d="M551 176Q543 135 524 100T474 40T404 0T315 -14Q263 -14 217 3T135 52T80 132T59 240V252Q59 312 79 360T135 441T216 492T315 510Q362 510 402 496T472 457T522 396T549 320L471 302Q468 328 457 352T426 395T378 425T313
436Q277 436 246 423T190 385T153 326T139 252V240Q139 198 152 165T190 108T246 73T315 60Q352 60 379 71T426 101T457 144T473 194L551 176Z" />
<glyph unicode="d" glyph-name="d" d="M471 76H459Q447 53 429 36T389 8T343 -8T297 -14Q247 -14 204 3T129 52T78 131T59 240V256Q59 316 78 363T129 443T204 493T295 510Q346 510 390 488T459 418H471V700H549V0H471V76ZM305 60Q340 60 370 73T422 110T458 167T471
242V254Q471 294 458 327T423 385T370 422T305 436Q270 436 240 423T187 386T152 329T139 256V240Q139 198 151 165T186 109T239 73T305 60Z" />
<glyph unicode="e" glyph-name="e" d="M144 224Q147 150 190 105T310 60Q345 60 371 68T415 90T445 122T464 162L538 142Q517 73 461 30T308 -14Q255 -14 211 4T134 57T84 138T66 242V266Q66 318 84 363T136 440T213 491T310 510Q371 510 415 488T488 432T530
360T544 288V224H144ZM310 436Q277 436 249 426T199 396T164 352T146 296H466Q464 328 451 354T416 398T367 426T310 436Z" />
<glyph unicode="f" glyph-name="f" d="M82 496H235V622Q235 656 256 678T312 700H508V628H340Q313 628 313 598V496H520V424H313V0H235V424H82V496Z" />
<glyph unicode="g" glyph-name="g" d="M464 76H452Q428 31 387 9T296 -14Q246 -14 202 3T125 52T72 131T52 240V256Q52 316 72 363T125 443T202 493T294 510Q348 510 388 487T452 418H464V496H542V-122Q542 -156 521 -178T465 -200H142V-128H437Q464 -128 464
-98V76ZM298 60Q333 60 363 73T415 110T451 167T464 242V254Q464 294 451 327T416 385T363 422T298 436Q263 436 233 423T180 386T145 329T132 256V240Q132 198 144 165T179 109T232 73T298 60Z" />
<glyph unicode="h" glyph-name="h" d="M165 0H87V700H165V406H177Q200 454 241 482T343 510Q424 510 474 457T525 296V0H447V280Q447 358 412 397T317 436Q246 436 206 388T165 258V0Z" />
<glyph unicode="i" glyph-name="i" d="M241 644Q241 673 261 693T311 714Q340 714 360 694T381 644Q381 615 361 595T311 574Q282 574 262 594T241 644ZM99 72H273V424H117V496H351V72H513V0H99V72Z" />
<glyph unicode="j" glyph-name="j" d="M307 644Q307 673 327 693T377 714Q406 714 426 694T447 644Q447 615 427 595T377 574Q348 574 328 594T307 644ZM141 496H417V-122Q417 -156 396 -178T340 -200H117V-128H312Q339 -128 339 -98V424H141V496Z" />
<glyph unicode="k" glyph-name="k" d="M215 290H232L421 496H517V490L311 263V245L541 6V0H445L234 218H215V0H137V700H215V290Z" />
<glyph unicode="l" glyph-name="l" d="M87 72H267V628H93V700H345V72H525V0H87V72Z" />
<glyph unicode="m" glyph-name="m" d="M564 0H486V356Q486 391 470 413T419 436Q386 436 366 412T345 336V0H267V360Q267 393 249 414T201 436Q165 436 146 410T126 342V0H48V496H126V442H138Q151 477 176 493T235 510Q271 510 294 491T327 442H339Q373 510 447
510Q503 510 533 475T564 382V0Z" />
<glyph unicode="n" glyph-name="n" d="M165 0H87V496H165V412H177Q223 510 337 510Q423 510 474 457T525 296V0H447V280Q447 358 412 397T317 436Q246 436 206 388T165 258V0Z" />
<glyph unicode="o" glyph-name="o" d="M555 242Q555 180 535 133T480 53T401 3T306 -14Q256 -14 211 3T132 52T78 132T57 242V254Q57 315 77 362T132 443T212 493T306 510Q355 510 400 493T479 443T534 363T555 254V242ZM306 60Q342 60 372 72T426 109T462 166T475
242V254Q475 294 462 327T426 385T372 422T306 436Q271 436 240 423T186 385T150 328T137 254V242Q137 200 150 167T186 109T239 73T306 60Z" />
<glyph unicode="p" glyph-name="p" d="M147 -200H69V496H147V418H159Q185 463 231 486T331 510Q377 510 418 493T490 444T540 365T559 258V238Q559 177 541 130T492 51T418 3T329 -14Q305 -14 280 -9T233 8T191 36T159 76H147V-200ZM313 60Q349 60 379 72T431
108T466 164T479 238V258Q479 298 467 330T432 386T379 423T313 436Q278 436 248 423T196 385T160 328T147 254V242Q147 201 160 168T195 110T248 73T313 60Z" />
<glyph unicode="q" glyph-name="q" d="M467 76H455Q442 53 424 37T384 9T339 -8T293 -14Q243 -14 200 3T125 52T74 131T55 240V256Q55 316 74 363T125 443T200 493T291 510Q342 510 385 487T455 418H467V496H545V-200H467V76ZM301 60Q336 60 366 73T418 110T454
167T467 242V254Q467 294 454 327T419 385T366 422T301 436Q266 436 236 423T183 386T148 329T135 256V240Q135 198 147 165T182 109T235 73T301 60Z" />
<glyph unicode="r" glyph-name="r" d="M59 496H239V430H251Q270 471 305 490T385 510Q460 510 506 461T555 318L473 306Q473 375 440 405T359 436Q328 436 306 424T268 391T246 342T239 282V72H365V0H47V72H161V424H59V496Z" />
<glyph unicode="s" glyph-name="s" d="M190 368Q190 332 220 313T332 288Q419 281 464 247T510 146V140Q510 104 496 76T456 27T394 -3T314 -14Q256 -14 215 1T146 42T104 100T88 166L162 184Q167 127 206 93T310 58Q365 58 398 79T432 140Q432 182 399 200T292
223Q206 229 160 263T114 362V368Q114 403 129 429T169 474T227 501T294 510Q343 510 380 497T442 462T480 412T498 356L424 338Q419 386 386 413T298 440Q277 440 258 436T223 422T199 400T190 368Z" />
<glyph unicode="t" glyph-name="t" d="M70 496H226V700H304V496H496V424H304V102Q304 72 331 72H472V0H303Q269 0 248 22T226 78V424H70V496Z" />
<glyph unicode="u" glyph-name="u" d="M441 496H519V0H441V90H429Q405 42 366 14T267 -14Q226 -14 192 -1T133 40T95 107T81 200V496H159V210Q159 132 191 96T289 60Q360 60 400 108T441 238V496Z" />
<glyph unicode="v" glyph-name="v" d="M382 0H228L55 496H147L299 36H311L463 496H555L382 0Z" />
<glyph unicode="w" glyph-name="w" d="M516 0H372L312 460H300L240 0H96L18 496H98L164 36H176L234 496H378L436 36H448L514 496H594L516 0Z" />
<glyph unicode="x" glyph-name="x" d="M440 496H529L383 260V248L541 0H450L315 218H297L162 0H71L229 248V260L83 496H172L297 290H315L440 496Z" />
<glyph unicode="y" glyph-name="y" d="M447 90H435Q411 42 372 14T273 -14Q232 -14 198 -1T139 40T101 107T87 200V496H165V210Q165 132 197 96T295 60Q366 60 406 108T447 238V496H525V-122Q525 -156 504 -178T448 -200H165V-128H420Q447 -128 447 -98V90Z" />
<glyph unicode="z" glyph-name="z" d="M523 72V0H91V124L445 412V424H97V496H511V376L155 84V72H523Z" />
<glyph unicode="{" glyph-name="braceleft" d="M278 778Q278 812 299 834T355 856H452V784H383Q356 784 356 754V434Q356 400 335 378T278 356H266V344H278Q313 344 334 322T356 266V-54Q356 -84 383 -84H452V-156H355Q321 -156 300 -134T278 -78V267Q278 296
251 296H200V404H251Q278 404 278 433V778Z" />
<glyph unicode="|" glyph-name="bar" d="M342 -156H270V856H342V-156Z" />
<glyph unicode="}" glyph-name="braceright" d="M334 433Q334 404 361 404H412V296H361Q334 296 334 267V-78Q334 -112 313 -134T257 -156H160V-84H229Q256 -84 256 -54V266Q256 300 277 322T334 344H346V356H334Q299 356 278 378T256 434V754Q256 784 229 784H160V856H257Q291
856 312 834T334 778V433Z" />
<glyph unicode="~" glyph-name="asciitilde" d="M338 316Q340 308 345 300T361 291Q369 291 381 300L510 395L548 345L425 251Q411 240 396 232T357 224Q318 224 301 244T273 300Q271 309 267 318T250 328Q241 328 227 317L101 224L63 274L186 368Q201 380 217
387T254 395Q292 395 309 374T338 316Z" />
<glyph unicode="&#xa0;" glyph-name="uni00A0" />
<glyph unicode="&#xa1;" glyph-name="exclamdown" d="M236 444Q236 415 256 395T306 374Q335 374 355 394T376 444Q376 473 356 493T306 514Q277 514 257 494T236 444ZM346 -200V314H266V-200H346Z" />
<glyph unicode="&#xa2;" glyph-name="cent" d="M351 609Q432 599 484 548T550 422L472 404Q467 449 437 486T351 534V165Q379 170 400 182T437 213T461 252T474 296L552 278Q538 203 486 152T351 90V28H279V90Q233 96 193 115T124 166T77 243T60 342V354Q60 408
77 452T123 530T193 583T279 609V672H351V609ZM140 342Q140 305 150 275T179 223T223 186T279 165V534Q249 528 224 513T180 474T151 420T140 354V342Z" />
<glyph unicode="&#xa3;" glyph-name="sterling" d="M248 366H338V294H248V174H490V102H110V174H170V294H110V366H170V440Q170 523 214 567T336 612Q411 612 456 568T502 440V416H424V440Q424 491 399 515T336 540Q298 540 273 516T248 440V366Z" />
<glyph unicode="&#xa4;" glyph-name="currency" d="M56 350Q56 391 68 428T103 496L44 555L101 612L160 553Q191 575 227 587T306 600Q347 600 384 588T452 553L511 612L568 555L509 496Q531 465 543 428T556 350Q556 308 544 272T509 204L568 145L511 88L452
147Q421 124 384 112T306 100Q264 100 228 112T160 147L101 88L44 145L103 204Q80 235 68 271T56 350ZM134 350Q134 314 147 283T184 228T238 192T306 178Q342 178 373 191T428 228T464 282T478 350Q478 386 465 417T428 472T374 508T306 522Q270 522 239 509T184
472T148 418T134 350Z" />
<glyph unicode="&#xa5;" glyph-name="yen" d="M132 366H218L96 598H182L300 366H312L430 598H516L394 366H480V294H342V258H480V186H342V102H270V186H132V258H270V294H132V366Z" />
<glyph unicode="&#xa6;" glyph-name="brokenbar" d="M342 314V-156H270V314H342ZM270 386V856H342V386H270Z" />
<glyph unicode="&#xa7;" glyph-name="section" d="M184 494Q184 510 189 522T202 545Q195 556 190 571T184 604Q184 629 194 649T221 684T262 706T312 714Q343 714 367 705T407 680T431 645T439 604V588H371V594Q371 615 354 631T308 648Q282 648 268 636T254
605Q254 587 271 575T340 554Q392 545 418 520T445 448Q445 433 440 421T428 395Q445 371 445 336Q445 285 409 252T312 218Q243 218 208 255T172 347V359H240V353Q240 325 258 305T314 284Q349 284 362 299T375 331Q375 351 359 364T294 386Q273 390 254 396T219
415T194 446T184 494ZM340 441Q348 439 357 437T374 432Q375 434 375 438T375 445Q375 463 359 476T294 499Q285 501 275 503T256 509Q255 507 255 502T254 493Q254 476 271 463T340 441Z" />
<glyph unicode="&#xa8;" glyph-name="dieresis" d="M136 644Q136 673 156 693T206 714Q235 714 255 694T276 644Q276 615 256 595T206 574Q177 574 157 594T136 644ZM336 644Q336 673 356 693T406 714Q435 714 455 694T476 644Q476 615 456 595T406 574Q377 574
357 594T336 644Z" />
<glyph unicode="&#xa9;" glyph-name="copyright" d="M58 556Q58 607 77 652T130 731T209 784T306 804Q357 804 402 785T481 732T534 653T554 556Q554 505 535 460T482 381T403 328T306 308Q255 308 210 327T131 380T78 459T58 556ZM106 556Q106 514 121 478T164
414T227 372T306 356Q348 356 384 371T448 414T490 477T506 556Q506 598 491 634T448 698T385 740T306 756Q264 756 228 741T164 698T122 635T106 556ZM306 454Q329 454 342 468T355 505V523H409V511Q409 465 383 436T306 406Q256 406 229 435T201 511V601Q201
647 229 676T306 706Q357 706 383 677T409 601V589H355V607Q355 629 342 643T306 658Q283 658 269 644T255 607V505Q255 483 269 469T306 454Z" />
<glyph unicode="&#xaa;" glyph-name="ordfeminine" d="M373 452Q363 428 340 417T289 406Q262 406 238 416T196 445T168 492T157 556Q157 592 167 619T196 666T238 696T291 706Q350 706 373 666H379V698H445V489Q445 472 461 472H475V412H427Q407 412 394 422T379
452H373ZM301 466Q333 466 356 487T379 556Q379 601 358 623T301 646Q265 646 244 621T223 556Q223 512 244 489T301 466Z" />
<glyph unicode="&#xab;" glyph-name="guillemotleft" d="M312 12L78 170V326L312 484H318V396L108 254V242L318 100V12H312ZM528 12L294 170V326L528 484H534V396L324 254V242L534 100V12H528Z" />
<glyph unicode="&#xac;" glyph-name="logicalnot" d="M97 386H515V230H443V314H97V386Z" />
<glyph unicode="&#xae;" glyph-name="registered" d="M58 556Q58 607 77 652T130 731T209 784T306 804Q357 804 402 785T481 732T534 653T554 556Q554 505 535 460T482 381T403 328T306 308Q255 308 210 327T131 380T78 459T58 556ZM106 556Q106 514 121 478T164
414T227 372T306 356Q348 356 384 371T448 414T490 477T506 556Q506 598 491 634T448 698T385 740T306 756Q264 756 228 741T164 698T122 635T106 556ZM402 412H348V495Q348 506 342 513T323 520H276V412H222V700H318Q363 700 385 676T408 620Q408 594 400 577T368
549V543Q386 541 394 529T402 502V412ZM276 568H308Q331 568 342 580T354 612Q354 631 343 642T308 653H276V568Z" />
<glyph unicode="&#xaf;" glyph-name="overscore" d="M447 570H165V636H447V570Z" />
<glyph unicode="&#xb0;" glyph-name="degree" d="M161 569Q161 599 172 625T203 671T249 702T306 714Q336 714 362 703T408 672T439 626T451 569Q451 539 440 513T409 467T363 436T306 424Q276 424 250 435T204 466T173 512T161 569ZM233 569Q233 539 254 518T306
496Q336 496 357 517T379 569Q379 599 358 620T306 642Q276 642 255 621T233 569Z" />
<glyph unicode="&#xb1;" glyph-name="plusminus" d="M97 386H270V559H342V386H515V314H342V141H270V314H97V386ZM97 72H515V0H97V72Z" />
<glyph unicode="&#xb2;" glyph-name="twosuperior" d="M405 460V412H210V466Q210 508 234 530T306 564Q339 572 346 586T354 614Q354 631 343 644T308 658Q285 658 272 644T258 604V586H204V604Q204 646 231 676T310 706Q334 706 352 699T383 679T401 650T408
616Q408 580 390 554T324 518Q288 510 276 498T264 466V460H405Z" />
<glyph unicode="&#xb3;" glyph-name="threesuperior" d="M276 542V618L358 646V652H213V700H400V616L318 588V582H324Q360 582 384 562T408 502Q408 459 381 433T308 406Q260 406 232 434T204 502V518H258V504Q258 481 270 468T306 454Q329 454 341 466T354 498Q354
522 340 532T308 542H276Z" />
<glyph unicode="&#xb4;" glyph-name="acute" d="M386 688L302 570H230L296 688H386Z" />
<glyph unicode="&#xb5;" glyph-name="mu" d="M447 60H435Q424 32 393 9T306 -14Q250 -14 219 9T177 60H165V-200H87V496H165V216Q165 138 205 99T306 60Q366 60 406 99T447 216V496H525V0H447V60Z" />
<glyph unicode="&#xb6;" glyph-name="paragraph" d="M269 424Q239 424 213 435T167 466T136 512T124 569Q124 599 135 625T166 671T212 702T269 714H449V218H377V642H341V218H269V424ZM269 642Q239 642 218 621T196 569Q196 539 217 518T269 496V642Z" />
<glyph unicode="&#xb7;" glyph-name="middot" d="M236 350Q236 379 256 399T306 420Q335 420 355 400T376 350Q376 321 356 301T306 280Q277 280 257 300T236 350Z" />
<glyph unicode="&#xb8;" glyph-name="cedilla" d="M281 0L266 -68H272Q285 -36 326 -36Q361 -36 381 -61T402 -121Q402 -163 375 -187T309 -212Q266 -212 243 -192T212 -142L260 -124Q263 -139 274 -151T308 -164Q323 -164 335 -154T348 -122Q348 -104 338 -94T313
-84Q295 -84 288 -98H212V-92L232 0H281Z" />
<glyph unicode="&#xb9;" glyph-name="onesuperior" d="M293 460V670H284L262 577H209L241 700H347V460H418V412H215V460H293Z" />
<glyph unicode="&#xba;" glyph-name="ordmasculine" d="M157 556Q157 593 169 621T203 668T250 696T306 706Q334 706 361 697T409 668T442 621T455 556Q455 519 443 491T409 444T361 416T306 406Q277 406 251 415T203 444T170 491T157 556ZM306 466Q340 466 364
489T389 556Q389 600 365 623T306 646Q272 646 248 623T223 556Q223 512 247 489T306 466Z" />
<glyph unicode="&#xbb;" glyph-name="guillemotright" d="M294 12V100L504 242V254L294 396V484H300L534 326V170L300 12H294ZM78 12V100L288 242V254L78 396V484H84L318 326V170L84 12H78Z" />
<glyph unicode="&#xbc;" glyph-name="onequarter" d="M531 494L555 448L82 207L58 253L531 494ZM136 460V670H127L105 577H52L84 700H190V460H261V412H58V460H136ZM410 289H509V103H549V55H509V1H455V55H325V121L410 289ZM373 109V103H455V259H449L373 109Z" />
<glyph unicode="&#xbd;" glyph-name="onehalf" d="M531 494L555 448L82 207L58 253L531 494ZM552 49V1H357V55Q357 97 381 119T453 153Q486 161 493 175T501 203Q501 220 490 233T455 247Q432 247 419 233T405 193V175H351V193Q351 235 378 265T457 295Q481 295
499 288T530 268T548 239T555 205Q555 169 537 143T471 107Q435 99 423 87T411 55V49H552ZM136 460V670H127L105 577H52L84 700H190V460H261V412H58V460H136Z" />
<glyph unicode="&#xbe;" glyph-name="threequarters" d="M531 494L555 448L82 207L58 253L531 494ZM410 289H509V103H549V55H509V1H455V55H325V121L410 289ZM373 109V103H455V259H449L373 109ZM121 542V618L203 646V652H58V700H245V616L163 588V582H169Q205 582
229 562T253 502Q253 459 226 433T153 406Q105 406 77 434T49 502V518H103V504Q103 481 115 468T151 454Q174 454 186 466T199 498Q199 522 185 532T153 542H121Z" />
<glyph unicode="&#xbf;" glyph-name="questiondown" d="M260 136Q215 136 186 103T156 16V10Q156 -20 166 -46T196 -91T242 -122T302 -134Q374 -134 415 -90T456 26V68H540V20Q540 -26 525 -68T479 -142T404 -193T300 -212Q250 -212 208 -195T136 -149T89 -81T72
1V19Q72 58 85 93T123 155T179 196T250 212H264Q292 212 292 242V316H372V222Q372 184 348 160T286 136H260ZM401 446Q401 417 381 397T331 376Q302 376 282 396T261 446Q261 475 281 495T331 516Q360 516 380 496T401 446Z" />
<glyph unicode="&#xc0;" glyph-name="Agrave" d="M456 174H156L105 0H15L227 700H385L597 0H507L456 174ZM300 664L179 252H433L312 664H300ZM271 892L337 774H265L181 892H271Z" />
<glyph unicode="&#xc1;" glyph-name="Aacute" d="M456 174H156L105 0H15L227 700H385L597 0H507L456 174ZM300 664L179 252H433L312 664H300ZM431 892L347 774H275L341 892H431Z" />
<glyph unicode="&#xc2;" glyph-name="Acircumflex" d="M456 174H156L105 0H15L227 700H385L597 0H507L456 174ZM300 664L179 252H433L312 664H300ZM364 774L312 862H300L248 774H164L244 892H368L448 774H364Z" />
<glyph unicode="&#xc3;" glyph-name="Atilde" d="M456 174H156L105 0H15L227 700H385L597 0H507L456 174ZM300 664L179 252H433L312 664H300ZM337 846Q342 836 347 831T361 826Q371 826 380 836L428 891L477 849L436 800Q422 783 403 771T358 758Q327 758 311
772T277 817Q270 829 266 834T253 839Q242 839 231 827L185 774L136 816L177 865Q191 882 210 894T256 907Q285 907 302 893T337 846Z" />
<glyph unicode="&#xc4;" glyph-name="Adieresis" d="M456 174H156L105 0H15L227 700H385L597 0H507L456 174ZM300 664L179 252H433L312 664H300ZM136 848Q136 877 156 897T206 918Q235 918 255 898T276 848Q276 819 256 799T206 778Q177 778 157 798T136 848ZM336
848Q336 877 356 897T406 918Q435 918 455 898T476 848Q476 819 456 799T406 778Q377 778 357 798T336 848Z" />
<glyph unicode="&#xc5;" glyph-name="Aring" d="M456 174H156L105 0H15L227 700H385L597 0H507L456 174ZM300 664L179 252H433L312 664H300ZM204 874Q204 917 233 946T306 976Q349 976 378 947T408 874Q408 831 379 802T306 772Q263 772 234 801T204 874ZM264
874Q264 856 276 844T306 832Q324 832 336 844T348 874Q348 892 336 904T306 916Q288 916 276 904T264 874Z" />
<glyph unicode="&#xc6;" glyph-name="AE" d="M300 174H156L105 0H15L227 700H540V622H384V390H534V312H384V78H546V0H300V174ZM179 252H300V622H288L179 252Z" />
<glyph unicode="&#xc7;" glyph-name="Ccedilla" d="M310 64Q353 64 383 78T433 117T462 173T472 240V252H556V240Q556 187 540 141T493 60T416 6T310 -14H302L290 -68H296Q309 -36 350 -36Q385 -36 405 -61T426 -121Q426 -163 399 -187T333 -212Q290 -212 267
-192T236 -142L284 -124Q287 -139 298 -151T332 -164Q347 -164 359 -154T372 -122Q372 -104 362 -94T337 -84Q319 -84 312 -98H236V-92L254 -9Q163 7 114 78T64 272V428Q64 564 129 639T310 714Q370 714 416 695T493 641T540 560T556 460V448H472V460Q471 494 462
526T433 582T383 621T310 636Q229 636 189 577T148 422V278Q148 175 188 120T310 64Z" />
<glyph unicode="&#xc8;" glyph-name="Egrave" d="M94 700H518V622H178V390H512V312H178V78H524V0H94V700ZM292 892L358 774H286L202 892H292Z" />
<glyph unicode="&#xc9;" glyph-name="Eacute" d="M94 700H518V622H178V390H512V312H178V78H524V0H94V700ZM435 892L351 774H279L345 892H435Z" />
<glyph unicode="&#xca;" glyph-name="Ecircumflex" d="M94 700H518V622H178V390H512V312H178V78H524V0H94V700ZM366 774L314 862H302L250 774H166L246 892H370L450 774H366Z" />
<glyph unicode="&#xcb;" glyph-name="Edieresis" d="M94 700H518V622H178V390H512V312H178V78H524V0H94V700ZM140 848Q140 877 160 897T210 918Q239 918 259 898T280 848Q280 819 260 799T210 778Q181 778 161 798T140 848ZM340 848Q340 877 360 897T410 918Q439
918 459 898T480 848Q480 819 460 799T410 778Q381 778 361 798T340 848Z" />
<glyph unicode="&#xcc;" glyph-name="Igrave" d="M84 700H528V622H348V78H528V0H84V78H264V622H84V700ZM275 892L341 774H269L185 892H275Z" />
<glyph unicode="&#xcd;" glyph-name="Iacute" d="M84 700H528V622H348V78H528V0H84V78H264V622H84V700ZM426 892L342 774H270L336 892H426Z" />
<glyph unicode="&#xce;" glyph-name="Icircumflex" d="M84 700H528V622H348V78H528V0H84V78H264V622H84V700ZM364 774L312 862H300L248 774H164L244 892H368L448 774H364Z" />
<glyph unicode="&#xcf;" glyph-name="Idieresis" d="M84 700H528V622H348V78H528V0H84V78H264V622H84V700ZM136 848Q136 877 156 897T206 918Q235 918 255 898T276 848Q276 819 256 799T206 778Q177 778 157 798T136 848ZM336 848Q336 877 356 897T406 918Q435
918 455 898T476 848Q476 819 456 799T406 778Q377 778 357 798T336 848Z" />
<glyph unicode="&#xd0;" glyph-name="Eth" d="M73 389H133V622H73V700H303Q433 700 493 638T553 440V260Q553 124 493 62T303 0H73V78H133V311H73V389ZM291 78Q337 78 370 87T426 117T458 175T469 266V434Q469 489 459 525T426 582T371 613T291 622H217V389H325V311H217V78H291Z"
/>
<glyph unicode="&#xd1;" glyph-name="Ntilde" d="M443 36H455V700H539V0H371L169 664H157V0H73V700H241L443 36ZM344 846Q349 836 354 831T368 826Q378 826 387 836L435 891L484 849L443 800Q429 783 410 771T365 758Q334 758 318 772T284 817Q277 829 273 834T260
839Q249 839 238 827L192 774L143 816L184 865Q198 882 217 894T263 907Q292 907 309 893T344 846Z" />
<glyph unicode="&#xd2;" glyph-name="Ograve" d="M60 428Q60 564 125 639T306 714Q422 714 487 639T552 428V272Q552 132 487 59T306 -14Q190 -14 125 59T60 272V428ZM306 64Q387 64 427 119T468 278V422Q468 518 428 577T306 636Q225 636 185 577T144 422V278Q144
175 184 120T306 64ZM279 892L345 774H273L189 892H279Z" />
<glyph unicode="&#xd3;" glyph-name="Oacute" d="M60 428Q60 564 125 639T306 714Q422 714 487 639T552 428V272Q552 132 487 59T306 -14Q190 -14 125 59T60 272V428ZM306 64Q387 64 427 119T468 278V422Q468 518 428 577T306 636Q225 636 185 577T144 422V278Q144
175 184 120T306 64ZM430 892L346 774H274L340 892H430Z" />
<glyph unicode="&#xd4;" glyph-name="Ocircumflex" d="M60 428Q60 564 125 639T306 714Q422 714 487 639T552 428V272Q552 132 487 59T306 -14Q190 -14 125 59T60 272V428ZM306 64Q387 64 427 119T468 278V422Q468 518 428 577T306 636Q225 636 185 577T144 422V278Q144
175 184 120T306 64ZM364 774L312 862H300L248 774H164L244 892H368L448 774H364Z" />
<glyph unicode="&#xd5;" glyph-name="Otilde" d="M60 428Q60 564 125 639T306 714Q422 714 487 639T552 428V272Q552 132 487 59T306 -14Q190 -14 125 59T60 272V428ZM306 64Q387 64 427 119T468 278V422Q468 518 428 577T306 636Q225 636 185 577T144 422V278Q144
175 184 120T306 64ZM337 846Q342 836 347 831T361 826Q371 826 380 836L428 891L477 849L436 800Q422 783 403 771T358 758Q327 758 311 772T277 817Q270 829 266 834T253 839Q242 839 231 827L185 774L136 816L177 865Q191 882 210 894T256 907Q285 907 302 893T337
846Z" />
<glyph unicode="&#xd6;" glyph-name="Odieresis" d="M60 428Q60 564 125 639T306 714Q422 714 487 639T552 428V272Q552 132 487 59T306 -14Q190 -14 125 59T60 272V428ZM306 64Q387 64 427 119T468 278V422Q468 518 428 577T306 636Q225 636 185 577T144 422V278Q144
175 184 120T306 64ZM136 848Q136 877 156 897T206 918Q235 918 255 898T276 848Q276 819 256 799T206 778Q177 778 157 798T136 848ZM336 848Q336 877 356 897T406 918Q435 918 455 898T476 848Q476 819 456 799T406 778Q377 778 357 798T336 848Z" />
<glyph unicode="&#xd7;" glyph-name="multiply" d="M453 152L306 299L159 152L108 203L255 350L108 497L159 548L306 401L453 548L504 497L357 350L504 203L453 152Z" />
<glyph unicode="&#xd8;" glyph-name="Oslash" d="M161 27Q112 61 86 122T60 272V428Q60 564 125 639T306 714Q346 714 384 703L407 774L477 752L450 671Q499 636 525 575T552 428V272Q552 132 487 59T306 -14Q262 -14 229 -4L202 -86L131 -64L161 27ZM144 278Q144
168 189 113L359 628Q333 636 306 636Q225 636 185 577T144 422V278ZM306 64Q387 64 427 119T468 278V422Q468 526 422 584L254 71Q275 64 306 64Z" />
<glyph unicode="&#xd9;" glyph-name="Ugrave" d="M150 700V236Q150 151 189 108T306 64Q383 64 422 107T462 236V700H546V236Q546 114 482 50T306 -14Q194 -14 130 50T66 236V700H150ZM287 892L353 774H281L197 892H287Z" />
<glyph unicode="&#xda;" glyph-name="Uacute" d="M150 700V236Q150 151 189 108T306 64Q383 64 422 107T462 236V700H546V236Q546 114 482 50T306 -14Q194 -14 130 50T66 236V700H150ZM431 892L347 774H275L341 892H431Z" />
<glyph unicode="&#xdb;" glyph-name="Ucircumflex" d="M150 700V236Q150 151 189 108T306 64Q383 64 422 107T462 236V700H546V236Q546 114 482 50T306 -14Q194 -14 130 50T66 236V700H150ZM364 774L312 862H300L248 774H164L244 892H368L448 774H364Z" />
<glyph unicode="&#xdc;" glyph-name="Udieresis" d="M150 700V236Q150 151 189 108T306 64Q383 64 422 107T462 236V700H546V236Q546 114 482 50T306 -14Q194 -14 130 50T66 236V700H150ZM136 848Q136 877 156 897T206 918Q235 918 255 898T276 848Q276 819 256
799T206 778Q177 778 157 798T136 848ZM336 848Q336 877 356 897T406 918Q435 918 455 898T476 848Q476 819 456 799T406 778Q377 778 357 798T336 848Z" />
<glyph unicode="&#xdd;" glyph-name="Yacute" d="M264 246H246L27 700H121L300 318H312L491 700H585L366 246H348V0H264V246ZM426 892L342 774H270L336 892H426Z" />
<glyph unicode="&#xde;" glyph-name="Thorn" d="M169 150V0H85V700H169V562H335Q389 562 429 547T495 505T535 445T549 372V342Q549 304 536 269T495 208T428 166T335 150H169ZM169 228H325Q465 228 465 348V366Q465 419 431 451T325 484H169V228Z" />
<glyph unicode="&#xdf;" glyph-name="germandbls" d="M343 355H368Q406 355 441 343T504 308T547 250T563 170V164Q563 124 550 92T514 36T458 -1T386 -14Q342 -14 310 0T256 36T224 87T212 146L286 158Q286 112 312 85T382 58Q427 58 456 84T485 167Q485 198
474 220T443 256T396 276T338 283H284V430H306Q357 430 386 457T415 532V537Q415 561 406 580T381 613T344 634T299 642Q243 642 210 605T176 502V0H98V424H38V496H98V510Q98 558 113 596T155 660T218 700T299 714Q341 714 376 702T438 666T478 611T493 537V531Q493
492 480 463T446 414T398 382T343 367V355Z" />
<glyph unicode="&#xe0;" glyph-name="agrave" d="M447 84H435Q411 34 369 10T279 -14Q230 -14 188 2T115 51T65 131T47 240V256Q47 317 65 364T114 443T188 493T277 510Q328 510 369 488T435 418H447V496H525V102Q525 72 552 72H577V0H524Q490 0 469 22T447 78V84ZM287
60Q322 60 351 73T402 110T435 167T447 242V254Q447 294 435 327T402 385T351 422T287 436Q252 436 223 423T173 387T139 330T127 256V240Q127 155 171 108T287 60ZM503 688L569 570H497L413 688H503Z" />
<glyph unicode="&#xe1;" glyph-name="aacute" d="M447 84H435Q411 34 369 10T279 -14Q230 -14 188 2T115 51T65 131T47 240V256Q47 317 65 364T114 443T188 493T277 510Q328 510 369 488T435 418H447V496H525V102Q525 72 552 72H577V0H524Q490 0 469 22T447 78V84ZM287
60Q322 60 351 73T402 110T435 167T447 242V254Q447 294 435 327T402 385T351 422T287 436Q252 436 223 423T173 387T139 330T127 256V240Q127 155 171 108T287 60ZM394 688L310 570H238L304 688H394Z" />
<glyph unicode="&#xe2;" glyph-name="acircumflex" d="M447 84H435Q411 34 369 10T279 -14Q230 -14 188 2T115 51T65 131T47 240V256Q47 317 65 364T114 443T188 493T277 510Q328 510 369 488T435 418H447V496H525V102Q525 72 552 72H577V0H524Q490 0 469 22T447
78V84ZM287 60Q322 60 351 73T402 110T435 167T447 242V254Q447 294 435 327T402 385T351 422T287 436Q252 436 223 423T173 387T139 330T127 256V240Q127 155 171 108T287 60ZM592 570L540 658H528L476 570H392L472 688H596L676 570H592Z" />
<glyph unicode="&#xe3;" glyph-name="atilde" d="M447 84H435Q411 34 369 10T279 -14Q230 -14 188 2T115 51T65 131T47 240V256Q47 317 65 364T114 443T188 493T277 510Q328 510 369 488T435 418H447V496H525V102Q525 72 552 72H577V0H524Q490 0 469 22T447 78V84ZM287
60Q322 60 351 73T402 110T435 167T447 242V254Q447 294 435 327T402 385T351 422T287 436Q252 436 223 423T173 387T139 330T127 256V240Q127 155 171 108T287 60ZM589 642Q594 632 599 627T613 622Q623 622 632 632L680 687L729 645L688 596Q674 579 655 567T610
554Q579 554 563 568T529 613Q522 625 518 630T505 635Q494 635 483 623L437 570L388 612L429 661Q443 678 462 690T508 703Q537 703 554 689T589 642Z" />
<glyph unicode="&#xe4;" glyph-name="adieresis" d="M447 84H435Q411 34 369 10T279 -14Q230 -14 188 2T115 51T65 131T47 240V256Q47 317 65 364T114 443T188 493T277 510Q328 510 369 488T435 418H447V496H525V102Q525 72 552 72H577V0H524Q490 0 469 22T447
78V84ZM287 60Q322 60 351 73T402 110T435 167T447 242V254Q447 294 435 327T402 385T351 422T287 436Q252 436 223 423T173 387T139 330T127 256V240Q127 155 171 108T287 60ZM369 644Q369 673 389 693T439 714Q468 714 488 694T509 644Q509 615 489 595T439 574Q410
574 390 594T369 644ZM569 644Q569 673 589 693T639 714Q668 714 688 694T709 644Q709 615 689 595T639 574Q610 574 590 594T569 644Z" />
<glyph unicode="&#xe5;" glyph-name="aring" d="M447 84H435Q411 34 369 10T279 -14Q230 -14 188 2T115 51T65 131T47 240V256Q47 317 65 364T114 443T188 493T277 510Q328 510 369 488T435 418H447V496H525V102Q525 72 552 72H577V0H524Q490 0 469 22T447 78V84ZM287
60Q322 60 351 73T402 110T435 167T447 242V254Q447 294 435 327T402 385T351 422T287 436Q252 436 223 423T173 387T139 330T127 256V240Q127 155 171 108T287 60ZM432 672Q432 715 461 744T534 774Q577 774 606 745T636 672Q636 629 607 600T534 570Q491 570
462 599T432 672ZM492 672Q492 654 504 642T534 630Q552 630 564 642T576 672Q576 690 564 702T534 714Q516 714 504 702T492 672Z" />
<glyph unicode="&#xe6;" glyph-name="ae" d="M306 510Q367 510 411 488T484 432T526 360T540 288V224H341V62Q394 70 421 97T460 162L534 142Q513 73 457 30T306 -14H246Q205 -14 173 -3T118 29T84 76T72 134V146Q72 181 85 209T122 256T178 286T248 296H263V437Q219
432 193 405T158 330L84 348Q90 381 105 410T145 461T204 497T283 510H306ZM149 140Q149 103 176 81T253 58H263V224H257Q206 224 178 204T149 140ZM462 296Q459 351 424 386T341 432V296H462Z" />
<glyph unicode="&#xe7;" glyph-name="ccedilla" d="M551 176Q543 135 524 100T474 40T404 0T315 -14H307L295 -68H301Q314 -36 355 -36Q390 -36 410 -61T431 -121Q431 -163 404 -187T338 -212Q295 -212 272 -192T241 -142L289 -124Q292 -139 303 -151T337 -164Q352
-164 364 -154T377 -122Q377 -104 367 -94T342 -84Q324 -84 317 -98H241V-92L259 -9Q217 -1 181 19T117 70T75 144T59 240V252Q59 312 79 360T135 441T216 492T315 510Q362 510 402 496T472 457T522 396T549 320L471 302Q468 328 457 352T426 395T378 425T313 436Q277
436 246 423T190 385T153 326T139 252V240Q139 198 152 165T190 108T246 73T315 60Q352 60 379 71T426 101T457 144T473 194L551 176Z" />
<glyph unicode="&#xe8;" glyph-name="egrave" d="M144 224Q147 150 190 105T310 60Q345 60 371 68T415 90T445 122T464 162L538 142Q517 73 461 30T308 -14Q255 -14 211 4T134 57T84 138T66 242V266Q66 318 84 363T136 440T213 491T310 510Q371 510 415 488T488
432T530 360T544 288V224H144ZM310 436Q277 436 249 426T199 396T164 352T146 296H466Q464 328 451 354T416 398T367 426T310 436ZM536 688L602 570H530L446 688H536Z" />
<glyph unicode="&#xe9;" glyph-name="eacute" d="M144 224Q147 150 190 105T310 60Q345 60 371 68T415 90T445 122T464 162L538 142Q517 73 461 30T308 -14Q255 -14 211 4T134 57T84 138T66 242V266Q66 318 84 363T136 440T213 491T310 510Q371 510 415 488T488
432T530 360T544 288V224H144ZM310 436Q277 436 249 426T199 396T164 352T146 296H466Q464 328 451 354T416 398T367 426T310 436ZM429 688L345 570H273L339 688H429Z" />
<glyph unicode="&#xea;" glyph-name="ecircumflex" d="M144 224Q147 150 190 105T310 60Q345 60 371 68T415 90T445 122T464 162L538 142Q517 73 461 30T308 -14Q255 -14 211 4T134 57T84 138T66 242V266Q66 318 84 363T136 440T213 491T310 510Q371 510 415 488T488
432T530 360T544 288V224H144ZM310 436Q277 436 249 426T199 396T164 352T146 296H466Q464 328 451 354T416 398T367 426T310 436ZM365 570L313 658H301L249 570H165L245 688H369L449 570H365Z" />
<glyph unicode="&#xeb;" glyph-name="edieresis" d="M144 224Q147 150 190 105T310 60Q345 60 371 68T415 90T445 122T464 162L538 142Q517 73 461 30T308 -14Q255 -14 211 4T134 57T84 138T66 242V266Q66 318 84 363T136 440T213 491T310 510Q371 510 415 488T488
432T530 360T544 288V224H144ZM310 436Q277 436 249 426T199 396T164 352T146 296H466Q464 328 451 354T416 398T367 426T310 436ZM137 644Q137 673 157 693T207 714Q236 714 256 694T277 644Q277 615 257 595T207 574Q178 574 158 594T137 644ZM337 644Q337 673
357 693T407 714Q436 714 456 694T477 644Q477 615 457 595T407 574Q378 574 358 594T337 644Z" />
<glyph unicode="&#xec;" glyph-name="igrave" d="M99 72H273V424H117V496H351V72H513V0H99V72ZM537 688L603 570H531L447 688H537Z" />
<glyph unicode="&#xed;" glyph-name="iacute" d="M99 72H273V424H117V496H351V72H513V0H99V72ZM434 688L350 570H278L344 688H434Z" />
<glyph unicode="&#xee;" glyph-name="icircumflex" d="M99 72H273V424H117V496H351V72H513V0H99V72ZM370 570L318 658H306L254 570H170L250 688H374L454 570H370Z" />
<glyph unicode="&#xef;" glyph-name="idieresis" d="M99 72H273V424H117V496H351V72H513V0H99V72ZM142 644Q142 673 162 693T212 714Q241 714 261 694T282 644Q282 615 262 595T212 574Q183 574 163 594T142 644ZM342 644Q342 673 362 693T412 714Q441 714 461
694T482 644Q482 615 462 595T412 574Q383 574 363 594T342 644Z" />
<glyph unicode="&#xf0;" glyph-name="eth" d="M265 616Q215 634 160 640L178 714Q240 705 298 685L316 722L379 693L361 656Q412 628 449 587T509 496T544 389T555 271Q555 199 536 146T482 57T403 4T306 -14Q256 -14 211 3T132 52T78 132T57 242V254Q57 315 77
362T130 443T206 493T294 510Q345 510 381 490T436 440H448Q434 489 403 525T329 587L310 547L246 576L265 616ZM306 60Q342 60 372 73T426 110T462 171T475 254Q475 294 462 327T426 385T372 422T306 436Q271 436 240 423T186 385T150 328T137 254V242Q137 200
150 167T186 109T239 73T306 60Z" />
<glyph unicode="&#xf1;" glyph-name="ntilde" d="M165 0H87V496H165V412H177Q223 510 337 510Q423 510 474 457T525 296V0H447V280Q447 358 412 397T317 436Q246 436 206 388T165 258V0ZM379 639Q384 629 389 624T403 619Q413 619 422 629L470 684L519 642L478
593Q464 576 445 564T400 551Q369 551 353 565T319 610Q312 622 308 627T295 632Q284 632 273 620L227 567L178 609L219 658Q233 675 252 687T298 700Q327 700 344 686T379 639Z" />
<glyph unicode="&#xf2;" glyph-name="ograve" d="M555 242Q555 180 535 133T480 53T401 3T306 -14Q256 -14 211 3T132 52T78 132T57 242V254Q57 315 77 362T132 443T212 493T306 510Q355 510 400 493T479 443T534 363T555 254V242ZM306 60Q342 60 372 72T426 109T462
166T475 242V254Q475 294 462 327T426 385T372 422T306 436Q271 436 240 423T186 385T150 328T137 254V242Q137 200 150 167T186 109T239 73T306 60ZM535 688L601 570H529L445 688H535Z" />
<glyph unicode="&#xf3;" glyph-name="oacute" d="M555 242Q555 180 535 133T480 53T401 3T306 -14Q256 -14 211 3T132 52T78 132T57 242V254Q57 315 77 362T132 443T212 493T306 510Q355 510 400 493T479 443T534 363T555 254V242ZM306 60Q342 60 372 72T426 109T462
166T475 242V254Q475 294 462 327T426 385T372 422T306 436Q271 436 240 423T186 385T150 328T137 254V242Q137 200 150 167T186 109T239 73T306 60ZM428 688L344 570H272L338 688H428Z" />
<glyph unicode="&#xf4;" glyph-name="ocircumflex" d="M555 242Q555 180 535 133T480 53T401 3T306 -14Q256 -14 211 3T132 52T78 132T57 242V254Q57 315 77 362T132 443T212 493T306 510Q355 510 400 493T479 443T534 363T555 254V242ZM306 60Q342 60 372 72T426
109T462 166T475 242V254Q475 294 462 327T426 385T372 422T306 436Q271 436 240 423T186 385T150 328T137 254V242Q137 200 150 167T186 109T239 73T306 60ZM364 570L312 658H300L248 570H164L244 688H368L448 570H364Z" />
<glyph unicode="&#xf5;" glyph-name="otilde" d="M555 242Q555 180 535 133T480 53T401 3T306 -14Q256 -14 211 3T132 52T78 132T57 242V254Q57 315 77 362T132 443T212 493T306 510Q355 510 400 493T479 443T534 363T555 254V242ZM306 60Q342 60 372 72T426 109T462
166T475 242V254Q475 294 462 327T426 385T372 422T306 436Q271 436 240 423T186 385T150 328T137 254V242Q137 200 150 167T186 109T239 73T306 60ZM337 639Q342 629 347 624T361 619Q371 619 380 629L428 684L477 642L436 593Q422 576 403 564T358 551Q327 551
311 565T277 610Q270 622 266 627T253 632Q242 632 231 620L185 567L136 609L177 658Q191 675 210 687T256 700Q285 700 302 686T337 639Z" />
<glyph unicode="&#xf6;" glyph-name="odieresis" d="M555 242Q555 180 535 133T480 53T401 3T306 -14Q256 -14 211 3T132 52T78 132T57 242V254Q57 315 77 362T132 443T212 493T306 510Q355 510 400 493T479 443T534 363T555 254V242ZM306 60Q342 60 372 72T426
109T462 166T475 242V254Q475 294 462 327T426 385T372 422T306 436Q271 436 240 423T186 385T150 328T137 254V242Q137 200 150 167T186 109T239 73T306 60ZM136 644Q136 673 156 693T206 714Q235 714 255 694T276 644Q276 615 256 595T206 574Q177 574 157 594T136
644ZM336 644Q336 673 356 693T406 714Q435 714 455 694T476 644Q476 615 456 595T406 574Q377 574 357 594T336 644Z" />
<glyph unicode="&#xf7;" glyph-name="divide" d="M97 386H515V314H97V386ZM236 184Q236 213 256 233T306 254Q335 254 355 234T376 184Q376 155 356 135T306 114Q277 114 257 134T236 184ZM236 516Q236 545 256 565T306 586Q335 586 355 566T376 516Q376 487 356
467T306 446Q277 446 257 466T236 516Z" />
<glyph unicode="&#xf8;" glyph-name="oslash" d="M555 242Q555 180 535 133T480 53T401 3T306 -14Q280 -14 261 -10L242 -68L171 -46L190 12Q131 41 94 99T57 242V254Q57 315 77 362T132 443T212 493T306 510Q317 510 329 509T352 506L369 558L439 536L422 483Q480
454 517 396T555 254V242ZM137 242Q137 188 158 149T214 86L328 435Q323 436 317 436T306 436Q271 436 240 423T186 385T150 328T137 254V242ZM306 60Q342 60 372 72T426 109T462 166T475 242V254Q475 306 454 346T397 409L284 61Q289 60 294 60T306 60Z" />
<glyph unicode="&#xf9;" glyph-name="ugrave" d="M441 496H519V0H441V90H429Q405 42 366 14T267 -14Q226 -14 192 -1T133 40T95 107T81 200V496H159V210Q159 132 191 96T289 60Q360 60 400 108T441 238V496ZM533 688L599 570H527L443 688H533Z" />
<glyph unicode="&#xfa;" glyph-name="uacute" d="M441 496H519V0H441V90H429Q405 42 366 14T267 -14Q226 -14 192 -1T133 40T95 107T81 200V496H159V210Q159 132 191 96T289 60Q360 60 400 108T441 238V496ZM423 688L339 570H267L333 688H423Z" />
<glyph unicode="&#xfb;" glyph-name="ucircumflex" d="M441 496H519V0H441V90H429Q405 42 366 14T267 -14Q226 -14 192 -1T133 40T95 107T81 200V496H159V210Q159 132 191 96T289 60Q360 60 400 108T441 238V496ZM615 570L563 658H551L499 570H415L495 688H619L699
570H615Z" />
<glyph unicode="&#xfc;" glyph-name="udieresis" d="M441 496H519V0H441V90H429Q405 42 366 14T267 -14Q226 -14 192 -1T133 40T95 107T81 200V496H159V210Q159 132 191 96T289 60Q360 60 400 108T441 238V496ZM470 644Q470 673 450 693T400 714Q371 714 351 694T330
644Q330 615 350 595T400 574Q429 574 449 594T470 644ZM270 644Q270 673 250 693T200 714Q171 714 151 694T130 644Q130 615 150 595T200 574Q229 574 249 594T270 644Z" />
<glyph unicode="&#xfd;" glyph-name="yacute" d="M447 90H435Q411 42 372 14T273 -14Q232 -14 198 -1T139 40T101 107T87 200V496H165V210Q165 132 197 96T295 60Q366 60 406 108T447 238V496H525V-122Q525 -156 504 -178T448 -200H165V-128H420Q447 -128 447
-98V90ZM426 688L342 570H270L336 688H426Z" />
<glyph unicode="&#xfe;" glyph-name="thorn" d="M147 -200H69V700H147V418H159Q185 463 231 486T331 510Q377 510 418 493T490 444T540 365T559 258V238Q559 177 541 130T492 51T418 3T329 -14Q305 -14 280 -9T233 8T191 36T159 76H147V-200ZM313 60Q349 60 379
72T431 108T466 164T479 238V258Q479 298 467 330T432 386T379 423T313 436Q278 436 248 423T196 385T160 328T147 254V242Q147 201 160 168T195 110T248 73T313 60Z" />
<glyph unicode="&#xff;" glyph-name="ydieresis" d="M447 90H435Q411 42 372 14T273 -14Q232 -14 198 -1T139 40T101 107T87 200V496H165V210Q165 132 197 96T295 60Q366 60 406 108T447 238V496H525V-122Q525 -156 504 -178T448 -200H165V-128H420Q447 -128 447
-98V90ZM136 644Q136 673 156 693T206 714Q235 714 255 694T276 644Q276 615 256 595T206 574Q177 574 157 594T136 644ZM336 644Q336 673 356 693T406 714Q435 714 455 694T476 644Q476 615 456 595T406 574Q377 574 357 594T336 644Z" />
<glyph unicode="&#x2013;" glyph-name="endash" d="M73 296H539V224H73V296Z" />
<glyph unicode="&#x2014;" glyph-name="emdash" d="M12 296H600V224H12V296Z" />
<glyph unicode="&#x2018;" glyph-name="quoteleft" d="M376 538Q376 509 356 489T306 468Q277 468 257 488T236 538V636Q236 670 257 692T313 714H364V660H317Q290 660 290 630V605Q297 608 307 608Q335 608 355 588T376 538Z" />
<glyph unicode="&#x2019;" glyph-name="quoteright" d="M236 644Q236 673 256 693T306 714Q335 714 355 694T376 644V546Q376 512 355 490T299 468H248V522H295Q322 522 322 552V577Q314 574 305 574Q277 574 257 594T236 644Z" />
<glyph unicode="&#x201a;" glyph-name="quotesinglbase" d="M236 70Q236 99 256 119T306 140Q335 140 355 120T376 70V-28Q376 -62 355 -84T299 -106H248V-52H295Q322 -52 322 -22V3Q314 0 305 0Q277 0 257 20T236 70Z" />
<glyph unicode="&#x201c;" glyph-name="quotedblleft" d="M285 538Q285 509 265 489T215 468Q186 468 166 488T145 538V636Q145 670 166 692T222 714H273V660H226Q199 660 199 630V605Q206 608 216 608Q244 608 264 588T285 538ZM467 538Q467 509 447 489T397
468Q368 468 348 488T327 538V636Q327 670 348 692T404 714H455V660H408Q381 660 381 630V605Q388 608 398 608Q426 608 446 588T467 538Z" />
<glyph unicode="&#x201d;" glyph-name="quotedblright" d="M327 644Q327 673 347 693T397 714Q426 714 446 694T467 644V546Q467 512 446 490T390 468H339V522H386Q413 522 413 552V577Q405 574 396 574Q368 574 348 594T327 644ZM145 644Q145 673 165 693T215
714Q244 714 264 694T285 644V546Q285 512 264 490T208 468H157V522H204Q231 522 231 552V577Q223 574 214 574Q186 574 166 594T145 644Z" />
<glyph unicode="&#x201e;" glyph-name="quotedblbase" d="M327 70Q327 99 347 119T397 140Q426 140 446 120T467 70V-28Q467 -62 446 -84T390 -106H339V-52H386Q413 -52 413 -22V3Q405 0 396 0Q368 0 348 20T327 70ZM145 70Q145 99 165 119T215 140Q244 140 264
120T285 70V-28Q285 -62 264 -84T208 -106H157V-52H204Q231 -52 231 -22V3Q223 0 214 0Q186 0 166 20T145 70Z" />
<glyph unicode="&#x2022;" glyph-name="bullet" d="M188 350Q188 374 197 395T223 433T260 458T306 468Q330 468 351 459T389 433T414 396T424 350Q424 326 415 305T389 267T352 242T306 232Q282 232 261 241T223 267T198 304T188 350Z" />
<glyph unicode="&#x2039;" glyph-name="guilsinglleft" d="M420 12L186 170V326L420 484H426V396L216 254V242L426 100V12H420Z" />
<glyph unicode="&#x203a;" glyph-name="guilsinglright" d="M186 12V100L396 242V254L186 396V484H192L426 326V170L192 12H186Z" />
</font>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,13 @@
/* space-mono-regular - latin */
@font-face {
font-family: 'Space Mono';
font-style: normal;
font-weight: 400;
src: url('space-mono-v3-latin-regular.eot'); /* IE9 Compat Modes */
src: local('Space Mono'), local('SpaceMono-Regular'),
url('space-mono-v3-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('space-mono-v3-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
url('space-mono-v3-latin-regular.woff') format('woff'), /* Modern Browsers */
url('space-mono-v3-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
url('space-mono-v3-latin-regular.svg#SpaceMono') format('svg'); /* Legacy iOS */
}

2
lib/js/classList.js Normal file
View File

@ -0,0 +1,2 @@
/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
if(typeof document!=="undefined"&&!("classList" in document.createElement("a"))){(function(j){var a="classList",f="prototype",m=(j.HTMLElement||j.Element)[f],b=Object,k=String[f].trim||function(){return this.replace(/^\s+|\s+$/g,"")},c=Array[f].indexOf||function(q){var p=0,o=this.length;for(;p<o;p++){if(p in this&&this[p]===q){return p}}return -1},n=function(o,p){this.name=o;this.code=DOMException[o];this.message=p},g=function(p,o){if(o===""){throw new n("SYNTAX_ERR","An invalid or illegal string was specified")}if(/\s/.test(o)){throw new n("INVALID_CHARACTER_ERR","String contains an invalid character")}return c.call(p,o)},d=function(s){var r=k.call(s.className),q=r?r.split(/\s+/):[],p=0,o=q.length;for(;p<o;p++){this.push(q[p])}this._updateClassName=function(){s.className=this.toString()}},e=d[f]=[],i=function(){return new d(this)};n[f]=Error[f];e.item=function(o){return this[o]||null};e.contains=function(o){o+="";return g(this,o)!==-1};e.add=function(o){o+="";if(g(this,o)===-1){this.push(o);this._updateClassName()}};e.remove=function(p){p+="";var o=g(this,p);if(o!==-1){this.splice(o,1);this._updateClassName()}};e.toggle=function(o){o+="";if(g(this,o)===-1){this.add(o)}else{this.remove(o)}};e.toString=function(){return this.join(" ")};if(b.defineProperty){var l={get:i,enumerable:true,configurable:true};try{b.defineProperty(m,a,l)}catch(h){if(h.number===-2146823252){l.enumerable=false;b.defineProperty(m,a,l)}}}else{if(b[f].__defineGetter__){m.__defineGetter__(a,i)}}}(self))};

6
lib/js/head.min.js vendored Normal file
View File

@ -0,0 +1,6 @@
/*! head.core - v1.0.2 */
(function(n,t){"use strict";function r(n){a[a.length]=n}function k(n){var t=new RegExp(" ?\\b"+n+"\\b");c.className=c.className.replace(t,"")}function p(n,t){for(var i=0,r=n.length;i<r;i++)t.call(n,n[i],i)}function tt(){var t,e,f,o;c.className=c.className.replace(/ (w-|eq-|gt-|gte-|lt-|lte-|portrait|no-portrait|landscape|no-landscape)\d+/g,"");t=n.innerWidth||c.clientWidth;e=n.outerWidth||n.screen.width;u.screen.innerWidth=t;u.screen.outerWidth=e;r("w-"+t);p(i.screens,function(n){t>n?(i.screensCss.gt&&r("gt-"+n),i.screensCss.gte&&r("gte-"+n)):t<n?(i.screensCss.lt&&r("lt-"+n),i.screensCss.lte&&r("lte-"+n)):t===n&&(i.screensCss.lte&&r("lte-"+n),i.screensCss.eq&&r("e-q"+n),i.screensCss.gte&&r("gte-"+n))});f=n.innerHeight||c.clientHeight;o=n.outerHeight||n.screen.height;u.screen.innerHeight=f;u.screen.outerHeight=o;u.feature("portrait",f>t);u.feature("landscape",f<t)}function it(){n.clearTimeout(b);b=n.setTimeout(tt,50)}var y=n.document,rt=n.navigator,ut=n.location,c=y.documentElement,a=[],i={screens:[240,320,480,640,768,800,1024,1280,1440,1680,1920],screensCss:{gt:!0,gte:!1,lt:!0,lte:!1,eq:!1},browsers:[{ie:{min:6,max:11}}],browserCss:{gt:!0,gte:!1,lt:!0,lte:!1,eq:!0},html5:!0,page:"-page",section:"-section",head:"head"},v,u,s,w,o,h,l,d,f,g,nt,e,b;if(n.head_conf)for(v in n.head_conf)n.head_conf[v]!==t&&(i[v]=n.head_conf[v]);u=n[i.head]=function(){u.ready.apply(null,arguments)};u.feature=function(n,t,i){return n?(Object.prototype.toString.call(t)==="[object Function]"&&(t=t.call()),r((t?"":"no-")+n),u[n]=!!t,i||(k("no-"+n),k(n),u.feature()),u):(c.className+=" "+a.join(" "),a=[],u)};u.feature("js",!0);s=rt.userAgent.toLowerCase();w=/mobile|android|kindle|silk|midp|phone|(windows .+arm|touch)/.test(s);u.feature("mobile",w,!0);u.feature("desktop",!w,!0);s=/(chrome|firefox)[ \/]([\w.]+)/.exec(s)||/(iphone|ipad|ipod)(?:.*version)?[ \/]([\w.]+)/.exec(s)||/(android)(?:.*version)?[ \/]([\w.]+)/.exec(s)||/(webkit|opera)(?:.*version)?[ \/]([\w.]+)/.exec(s)||/(msie) ([\w.]+)/.exec(s)||/(trident).+rv:(\w.)+/.exec(s)||[];o=s[1];h=parseFloat(s[2]);switch(o){case"msie":case"trident":o="ie";h=y.documentMode||h;break;case"firefox":o="ff";break;case"ipod":case"ipad":case"iphone":o="ios";break;case"webkit":o="safari"}for(u.browser={name:o,version:h},u.browser[o]=!0,l=0,d=i.browsers.length;l<d;l++)for(f in i.browsers[l])if(o===f)for(r(f),g=i.browsers[l][f].min,nt=i.browsers[l][f].max,e=g;e<=nt;e++)h>e?(i.browserCss.gt&&r("gt-"+f+e),i.browserCss.gte&&r("gte-"+f+e)):h<e?(i.browserCss.lt&&r("lt-"+f+e),i.browserCss.lte&&r("lte-"+f+e)):h===e&&(i.browserCss.lte&&r("lte-"+f+e),i.browserCss.eq&&r("eq-"+f+e),i.browserCss.gte&&r("gte-"+f+e));else r("no-"+f);r(o);r(o+parseInt(h,10));i.html5&&o==="ie"&&h<9&&p("abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|progress|section|summary|time|video".split("|"),function(n){y.createElement(n)});p(ut.pathname.split("/"),function(n,u){if(this.length>2&&this[u+1]!==t)u&&r(this.slice(u,u+1).join("-").toLowerCase()+i.section);else{var f=n||"index",e=f.indexOf(".");e>0&&(f=f.substring(0,e));c.id=f.toLowerCase()+i.page;u||r("root"+i.section)}});u.screen={height:n.screen.height,width:n.screen.width};tt();b=0;n.addEventListener?n.addEventListener("resize",it,!1):n.attachEvent("onresize",it)})(window);
/*! head.css3 - v1.0.0 */
(function(n,t){"use strict";function a(n){for(var r in n)if(i[n[r]]!==t)return!0;return!1}function r(n){var t=n.charAt(0).toUpperCase()+n.substr(1),i=(n+" "+c.join(t+" ")+t).split(" ");return!!a(i)}var h=n.document,o=h.createElement("i"),i=o.style,s=" -o- -moz- -ms- -webkit- -khtml- ".split(" "),c="Webkit Moz O ms Khtml".split(" "),l=n.head_conf&&n.head_conf.head||"head",u=n[l],f={gradient:function(){var n="background-image:";return i.cssText=(n+s.join("gradient(linear,left top,right bottom,from(#9f9),to(#fff));"+n)+s.join("linear-gradient(left top,#eee,#fff);"+n)).slice(0,-n.length),!!i.backgroundImage},rgba:function(){return i.cssText="background-color:rgba(0,0,0,0.5)",!!i.backgroundColor},opacity:function(){return o.style.opacity===""},textshadow:function(){return i.textShadow===""},multiplebgs:function(){i.cssText="background:url(https://),url(https://),red url(https://)";var n=(i.background||"").match(/url/g);return Object.prototype.toString.call(n)==="[object Array]"&&n.length===3},boxshadow:function(){return r("boxShadow")},borderimage:function(){return r("borderImage")},borderradius:function(){return r("borderRadius")},cssreflections:function(){return r("boxReflect")},csstransforms:function(){return r("transform")},csstransitions:function(){return r("transition")},touch:function(){return"ontouchstart"in n},retina:function(){return n.devicePixelRatio>1},fontface:function(){var t=u.browser.name,n=u.browser.version;switch(t){case"ie":return n>=9;case"chrome":return n>=13;case"ff":return n>=6;case"ios":return n>=5;case"android":return!1;case"webkit":return n>=5.1;case"opera":return n>=10;default:return!1}}};for(var e in f)f[e]&&u.feature(e,f[e].call(),!0);u.feature()})(window);
/*! head.load - v1.0.3 */
(function(n,t){"use strict";function w(){}function u(n,t){if(n){typeof n=="object"&&(n=[].slice.call(n));for(var i=0,r=n.length;i<r;i++)t.call(n,n[i],i)}}function it(n,i){var r=Object.prototype.toString.call(i).slice(8,-1);return i!==t&&i!==null&&r===n}function s(n){return it("Function",n)}function a(n){return it("Array",n)}function et(n){var i=n.split("/"),t=i[i.length-1],r=t.indexOf("?");return r!==-1?t.substring(0,r):t}function f(n){(n=n||w,n._done)||(n(),n._done=1)}function ot(n,t,r,u){var f=typeof n=="object"?n:{test:n,success:!t?!1:a(t)?t:[t],failure:!r?!1:a(r)?r:[r],callback:u||w},e=!!f.test;return e&&!!f.success?(f.success.push(f.callback),i.load.apply(null,f.success)):e||!f.failure?u():(f.failure.push(f.callback),i.load.apply(null,f.failure)),i}function v(n){var t={},i,r;if(typeof n=="object")for(i in n)!n[i]||(t={name:i,url:n[i]});else t={name:et(n),url:n};return(r=c[t.name],r&&r.url===t.url)?r:(c[t.name]=t,t)}function y(n){n=n||c;for(var t in n)if(n.hasOwnProperty(t)&&n[t].state!==l)return!1;return!0}function st(n){n.state=ft;u(n.onpreload,function(n){n.call()})}function ht(n){n.state===t&&(n.state=nt,n.onpreload=[],rt({url:n.url,type:"cache"},function(){st(n)}))}function ct(){var n=arguments,t=n[n.length-1],r=[].slice.call(n,1),f=r[0];return(s(t)||(t=null),a(n[0]))?(n[0].push(t),i.load.apply(null,n[0]),i):(f?(u(r,function(n){s(n)||!n||ht(v(n))}),b(v(n[0]),s(f)?f:function(){i.load.apply(null,r)})):b(v(n[0])),i)}function lt(){var n=arguments,t=n[n.length-1],r={};return(s(t)||(t=null),a(n[0]))?(n[0].push(t),i.load.apply(null,n[0]),i):(u(n,function(n){n!==t&&(n=v(n),r[n.name]=n)}),u(n,function(n){n!==t&&(n=v(n),b(n,function(){y(r)&&f(t)}))}),i)}function b(n,t){if(t=t||w,n.state===l){t();return}if(n.state===tt){i.ready(n.name,t);return}if(n.state===nt){n.onpreload.push(function(){b(n,t)});return}n.state=tt;rt(n,function(){n.state=l;t();u(h[n.name],function(n){f(n)});o&&y()&&u(h.ALL,function(n){f(n)})})}function at(n){n=n||"";var t=n.split("?")[0].split(".");return t[t.length-1].toLowerCase()}function rt(t,i){function e(t){t=t||n.event;u.onload=u.onreadystatechange=u.onerror=null;i()}function o(f){f=f||n.event;(f.type==="load"||/loaded|complete/.test(u.readyState)&&(!r.documentMode||r.documentMode<9))&&(n.clearTimeout(t.errorTimeout),n.clearTimeout(t.cssTimeout),u.onload=u.onreadystatechange=u.onerror=null,i())}function s(){if(t.state!==l&&t.cssRetries<=20){for(var i=0,f=r.styleSheets.length;i<f;i++)if(r.styleSheets[i].href===u.href){o({type:"load"});return}t.cssRetries++;t.cssTimeout=n.setTimeout(s,250)}}var u,h,f;i=i||w;h=at(t.url);h==="css"?(u=r.createElement("link"),u.type="text/"+(t.type||"css"),u.rel="stylesheet",u.href=t.url,t.cssRetries=0,t.cssTimeout=n.setTimeout(s,500)):(u=r.createElement("script"),u.type="text/"+(t.type||"javascript"),u.src=t.url);u.onload=u.onreadystatechange=o;u.onerror=e;u.async=!1;u.defer=!1;t.errorTimeout=n.setTimeout(function(){e({type:"timeout"})},7e3);f=r.head||r.getElementsByTagName("head")[0];f.insertBefore(u,f.lastChild)}function vt(){for(var t,u=r.getElementsByTagName("script"),n=0,f=u.length;n<f;n++)if(t=u[n].getAttribute("data-headjs-load"),!!t){i.load(t);return}}function yt(n,t){var v,p,e;return n===r?(o?f(t):d.push(t),i):(s(n)&&(t=n,n="ALL"),a(n))?(v={},u(n,function(n){v[n]=c[n];i.ready(n,function(){y(v)&&f(t)})}),i):typeof n!="string"||!s(t)?i:(p=c[n],p&&p.state===l||n==="ALL"&&y()&&o)?(f(t),i):(e=h[n],e?e.push(t):e=h[n]=[t],i)}function e(){if(!r.body){n.clearTimeout(i.readyTimeout);i.readyTimeout=n.setTimeout(e,50);return}o||(o=!0,vt(),u(d,function(n){f(n)}))}function k(){r.addEventListener?(r.removeEventListener("DOMContentLoaded",k,!1),e()):r.readyState==="complete"&&(r.detachEvent("onreadystatechange",k),e())}var r=n.document,d=[],h={},c={},ut="async"in r.createElement("script")||"MozAppearance"in r.documentElement.style||n.opera,o,g=n.head_conf&&n.head_conf.head||"head",i=n[g]=n[g]||function(){i.ready.apply(null,arguments)},nt=1,ft=2,tt=3,l=4,p;if(r.readyState==="complete")e();else if(r.addEventListener)r.addEventListener("DOMContentLoaded",k,!1),n.addEventListener("load",e,!1);else{r.attachEvent("onreadystatechange",k);n.attachEvent("onload",e);p=!1;try{p=!n.frameElement&&r.documentElement}catch(wt){}p&&p.doScroll&&function pt(){if(!o){try{p.doScroll("left")}catch(t){n.clearTimeout(i.readyTimeout);i.readyTimeout=n.setTimeout(pt,50);return}e()}}()}i.load=i.js=ut?lt:ct;i.test=ot;i.ready=yt;i.ready(r,function(){y()&&u(h.ALL,function(n){f(n)});i.feature&&i.feature("domloaded",!0)})})(window);

7
lib/js/html5shiv.js vendored Normal file
View File

@ -0,0 +1,7 @@
document.createElement('header');
document.createElement('nav');
document.createElement('section');
document.createElement('article');
document.createElement('aside');
document.createElement('footer');
document.createElement('hgroup');

6620
lib/js/socket.io.dev.js Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

9
lib/js/socket.io.js Normal file

File diff suppressed because one or more lines are too long

1
lib/js/socket.io.js.map Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,136 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>reveal.js - Markdown Demo</title>
<link rel="stylesheet" href="../../css/reveal.css">
<link rel="stylesheet" href="../../css/theme/white.css" id="theme">
<link rel="stylesheet" href="../../lib/css/zenburn.css">
</head>
<body>
<div class="reveal">
<div class="slides">
<!-- Use external markdown resource, separate slides by three newlines; vertical slides by two newlines -->
<section data-markdown="example.md" data-separator="^\n\n\n" data-separator-vertical="^\n\n"></section>
<!-- Slides are separated by three dashes (quick 'n dirty regular expression) -->
<section data-markdown data-separator="---">
<script type="text/template">
## Demo 1
Slide 1
---
## Demo 1
Slide 2
---
## Demo 1
Slide 3
</script>
</section>
<!-- Slides are separated by newline + three dashes + newline, vertical slides identical but two dashes -->
<section data-markdown data-separator="^\n---\n$" data-separator-vertical="^\n--\n$">
<script type="text/template">
## Demo 2
Slide 1.1
--
## Demo 2
Slide 1.2
---
## Demo 2
Slide 2
</script>
</section>
<!-- No "extra" slides, since there are no separators defined (so they'll become horizontal rulers) -->
<section data-markdown>
<script type="text/template">
A
---
B
---
C
</script>
</section>
<!-- Slide attributes -->
<section data-markdown>
<script type="text/template">
<!-- .slide: data-background="#000000" -->
## Slide attributes
</script>
</section>
<!-- Element attributes -->
<section data-markdown>
<script type="text/template">
## Element attributes
- Item 1 <!-- .element: class="fragment" data-fragment-index="2" -->
- Item 2 <!-- .element: class="fragment" data-fragment-index="1" -->
</script>
</section>
<!-- Code -->
<section data-markdown>
<script type="text/template">
```php
public function foo()
{
$foo = array(
'bar' => 'bar'
)
}
```
</script>
</section>
<!-- Images -->
<section data-markdown>
<script type="text/template">
![Sample image](https://s3.amazonaws.com/static.slid.es/logo/v2/slides-symbol-512x512.png)
</script>
</section>
</div>
</div>
<script src="../../lib/js/head.min.js"></script>
<script src="../../js/reveal.js"></script>
<script>
Reveal.initialize({
controls: true,
progress: true,
history: true,
center: true,
// Optional libraries used to extend on reveal.js
dependencies: [
{ src: '../../lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: 'marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: '../highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
{ src: '../notes/notes.js' }
]
});
</script>
</body>
</html>

View File

@ -0,0 +1,36 @@
# Markdown Demo
## External 1.1
Content 1.1
Note: This will only appear in the speaker notes window.
## External 1.2
Content 1.2
## External 2
Content 2.1
## External 3.1
Content 3.1
## External 3.2
Content 3.2
## External 3.3
![External Image](https://s3.amazonaws.com/static.slid.es/logo/v2/slides-symbol-512x512.png)

412
plugin/markdown/markdown.js Normal file
View File

@ -0,0 +1,412 @@
/**
* The reveal.js markdown plugin. Handles parsing of
* markdown inside of presentations as well as loading
* of external markdown documents.
*/
(function( root, factory ) {
if (typeof define === 'function' && define.amd) {
root.marked = require( './marked' );
root.RevealMarkdown = factory( root.marked );
root.RevealMarkdown.initialize();
} else if( typeof exports === 'object' ) {
module.exports = factory( require( './marked' ) );
} else {
// Browser globals (root is window)
root.RevealMarkdown = factory( root.marked );
root.RevealMarkdown.initialize();
}
}( this, function( marked ) {
var DEFAULT_SLIDE_SEPARATOR = '^\r?\n---\r?\n$',
DEFAULT_NOTES_SEPARATOR = 'notes?:',
DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR = '\\\.element\\\s*?(.+?)$',
DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR = '\\\.slide:\\\s*?(\\\S.+?)$';
var SCRIPT_END_PLACEHOLDER = '__SCRIPT_END__';
/**
* Retrieves the markdown contents of a slide section
* element. Normalizes leading tabs/whitespace.
*/
function getMarkdownFromSlide( section ) {
// look for a <script> or <textarea data-template> wrapper
var template = section.querySelector( '[data-template]' ) || section.querySelector( 'script' );
// strip leading whitespace so it isn't evaluated as code
var text = ( template || section ).textContent;
// restore script end tags
text = text.replace( new RegExp( SCRIPT_END_PLACEHOLDER, 'g' ), '</script>' );
var leadingWs = text.match( /^\n?(\s*)/ )[1].length,
leadingTabs = text.match( /^\n?(\t*)/ )[1].length;
if( leadingTabs > 0 ) {
text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' );
}
else if( leadingWs > 1 ) {
text = text.replace( new RegExp('\\n? {' + leadingWs + '}', 'g'), '\n' );
}
return text;
}
/**
* Given a markdown slide section element, this will
* return all arguments that aren't related to markdown
* parsing. Used to forward any other user-defined arguments
* to the output markdown slide.
*/
function getForwardedAttributes( section ) {
var attributes = section.attributes;
var result = [];
for( var i = 0, len = attributes.length; i < len; i++ ) {
var name = attributes[i].name,
value = attributes[i].value;
// disregard attributes that are used for markdown loading/parsing
if( /data\-(markdown|separator|vertical|notes)/gi.test( name ) ) continue;
if( value ) {
result.push( name + '="' + value + '"' );
}
else {
result.push( name );
}
}
return result.join( ' ' );
}
/**
* Inspects the given options and fills out default
* values for what's not defined.
*/
function getSlidifyOptions( options ) {
options = options || {};
options.separator = options.separator || DEFAULT_SLIDE_SEPARATOR;
options.notesSeparator = options.notesSeparator || DEFAULT_NOTES_SEPARATOR;
options.attributes = options.attributes || '';
return options;
}
/**
* Helper function for constructing a markdown slide.
*/
function createMarkdownSlide( content, options ) {
options = getSlidifyOptions( options );
var notesMatch = content.split( new RegExp( options.notesSeparator, 'mgi' ) );
if( notesMatch.length === 2 ) {
content = notesMatch[0] + '<aside class="notes">' + marked(notesMatch[1].trim()) + '</aside>';
}
// prevent script end tags in the content from interfering
// with parsing
content = content.replace( /<\/script>/g, SCRIPT_END_PLACEHOLDER );
return '<script type="text/template">' + content + '</script>';
}
/**
* Parses a data string into multiple slides based
* on the passed in separator arguments.
*/
function slidify( markdown, options ) {
options = getSlidifyOptions( options );
var separatorRegex = new RegExp( options.separator + ( options.verticalSeparator ? '|' + options.verticalSeparator : '' ), 'mg' ),
horizontalSeparatorRegex = new RegExp( options.separator );
var matches,
lastIndex = 0,
isHorizontal,
wasHorizontal = true,
content,
sectionStack = [];
// iterate until all blocks between separators are stacked up
while( matches = separatorRegex.exec( markdown ) ) {
notes = null;
// determine direction (horizontal by default)
isHorizontal = horizontalSeparatorRegex.test( matches[0] );
if( !isHorizontal && wasHorizontal ) {
// create vertical stack
sectionStack.push( [] );
}
// pluck slide content from markdown input
content = markdown.substring( lastIndex, matches.index );
if( isHorizontal && wasHorizontal ) {
// add to horizontal stack
sectionStack.push( content );
}
else {
// add to vertical stack
sectionStack[sectionStack.length-1].push( content );
}
lastIndex = separatorRegex.lastIndex;
wasHorizontal = isHorizontal;
}
// add the remaining slide
( wasHorizontal ? sectionStack : sectionStack[sectionStack.length-1] ).push( markdown.substring( lastIndex ) );
var markdownSections = '';
// flatten the hierarchical stack, and insert <section data-markdown> tags
for( var i = 0, len = sectionStack.length; i < len; i++ ) {
// vertical
if( sectionStack[i] instanceof Array ) {
markdownSections += '<section '+ options.attributes +'>';
sectionStack[i].forEach( function( child ) {
markdownSections += '<section data-markdown>' + createMarkdownSlide( child, options ) + '</section>';
} );
markdownSections += '</section>';
}
else {
markdownSections += '<section '+ options.attributes +' data-markdown>' + createMarkdownSlide( sectionStack[i], options ) + '</section>';
}
}
return markdownSections;
}
/**
* Parses any current data-markdown slides, splits
* multi-slide markdown into separate sections and
* handles loading of external markdown.
*/
function processSlides() {
var sections = document.querySelectorAll( '[data-markdown]'),
section;
for( var i = 0, len = sections.length; i < len; i++ ) {
section = sections[i];
if( section.getAttribute( 'data-markdown' ).length ) {
var xhr = new XMLHttpRequest(),
url = section.getAttribute( 'data-markdown' );
datacharset = section.getAttribute( 'data-charset' );
// see https://developer.mozilla.org/en-US/docs/Web/API/element.getAttribute#Notes
if( datacharset != null && datacharset != '' ) {
xhr.overrideMimeType( 'text/html; charset=' + datacharset );
}
xhr.onreadystatechange = function() {
if( xhr.readyState === 4 ) {
// file protocol yields status code 0 (useful for local debug, mobile applications etc.)
if ( ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status === 0 ) {
section.outerHTML = slidify( xhr.responseText, {
separator: section.getAttribute( 'data-separator' ),
verticalSeparator: section.getAttribute( 'data-separator-vertical' ),
notesSeparator: section.getAttribute( 'data-separator-notes' ),
attributes: getForwardedAttributes( section )
});
}
else {
section.outerHTML = '<section data-state="alert">' +
'ERROR: The attempt to fetch ' + url + ' failed with HTTP status ' + xhr.status + '.' +
'Check your browser\'s JavaScript console for more details.' +
'<p>Remember that you need to serve the presentation HTML from a HTTP server.</p>' +
'</section>';
}
}
};
xhr.open( 'GET', url, false );
try {
xhr.send();
}
catch ( e ) {
alert( 'Failed to get the Markdown file ' + url + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + e );
}
}
else if( section.getAttribute( 'data-separator' ) || section.getAttribute( 'data-separator-vertical' ) || section.getAttribute( 'data-separator-notes' ) ) {
section.outerHTML = slidify( getMarkdownFromSlide( section ), {
separator: section.getAttribute( 'data-separator' ),
verticalSeparator: section.getAttribute( 'data-separator-vertical' ),
notesSeparator: section.getAttribute( 'data-separator-notes' ),
attributes: getForwardedAttributes( section )
});
}
else {
section.innerHTML = createMarkdownSlide( getMarkdownFromSlide( section ) );
}
}
}
/**
* Check if a node value has the attributes pattern.
* If yes, extract it and add that value as one or several attributes
* the the terget element.
*
* You need Cache Killer on Chrome to see the effect on any FOM transformation
* directly on refresh (F5)
* http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development/7000899#answer-11786277
*/
function addAttributeInElement( node, elementTarget, separator ) {
var mardownClassesInElementsRegex = new RegExp( separator, 'mg' );
var mardownClassRegex = new RegExp( "([^\"= ]+?)=\"([^\"=]+?)\"", 'mg' );
var nodeValue = node.nodeValue;
if( matches = mardownClassesInElementsRegex.exec( nodeValue ) ) {
var classes = matches[1];
nodeValue = nodeValue.substring( 0, matches.index ) + nodeValue.substring( mardownClassesInElementsRegex.lastIndex );
node.nodeValue = nodeValue;
while( matchesClass = mardownClassRegex.exec( classes ) ) {
elementTarget.setAttribute( matchesClass[1], matchesClass[2] );
}
return true;
}
return false;
}
/**
* Add attributes to the parent element of a text node,
* or the element of an attribute node.
*/
function addAttributes( section, element, previousElement, separatorElementAttributes, separatorSectionAttributes ) {
if ( element != null && element.childNodes != undefined && element.childNodes.length > 0 ) {
previousParentElement = element;
for( var i = 0; i < element.childNodes.length; i++ ) {
childElement = element.childNodes[i];
if ( i > 0 ) {
j = i - 1;
while ( j >= 0 ) {
aPreviousChildElement = element.childNodes[j];
if ( typeof aPreviousChildElement.setAttribute == 'function' && aPreviousChildElement.tagName != "BR" ) {
previousParentElement = aPreviousChildElement;
break;
}
j = j - 1;
}
}
parentSection = section;
if( childElement.nodeName == "section" ) {
parentSection = childElement ;
previousParentElement = childElement ;
}
if ( typeof childElement.setAttribute == 'function' || childElement.nodeType == Node.COMMENT_NODE ) {
addAttributes( parentSection, childElement, previousParentElement, separatorElementAttributes, separatorSectionAttributes );
}
}
}
if ( element.nodeType == Node.COMMENT_NODE ) {
if ( addAttributeInElement( element, previousElement, separatorElementAttributes ) == false ) {
addAttributeInElement( element, section, separatorSectionAttributes );
}
}
}
/**
* Converts any current data-markdown slides in the
* DOM to HTML.
*/
function convertSlides() {
var sections = document.querySelectorAll( '[data-markdown]');
for( var i = 0, len = sections.length; i < len; i++ ) {
var section = sections[i];
// Only parse the same slide once
if( !section.getAttribute( 'data-markdown-parsed' ) ) {
section.setAttribute( 'data-markdown-parsed', true )
var notes = section.querySelector( 'aside.notes' );
var markdown = getMarkdownFromSlide( section );
section.innerHTML = marked( markdown );
addAttributes( section, section, null, section.getAttribute( 'data-element-attributes' ) ||
section.parentNode.getAttribute( 'data-element-attributes' ) ||
DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR,
section.getAttribute( 'data-attributes' ) ||
section.parentNode.getAttribute( 'data-attributes' ) ||
DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR);
// If there were notes, we need to re-add them after
// having overwritten the section's HTML
if( notes ) {
section.appendChild( notes );
}
}
}
}
// API
return {
initialize: function() {
if( typeof marked === 'undefined' ) {
throw 'The reveal.js Markdown plugin requires marked to be loaded';
}
if( typeof hljs !== 'undefined' ) {
marked.setOptions({
highlight: function( code, lang ) {
return hljs.highlightAuto( code, [lang] ).value;
}
});
}
var options = Reveal.getConfig().markdown;
if ( options ) {
marked.setOptions( options );
}
processSlides();
convertSlides();
},
// TODO: Do these belong in the API?
processSlides: processSlides,
convertSlides: convertSlides,
slidify: slidify
};
}));

File diff suppressed because one or more lines are too long

67
plugin/math/math.js Normal file
View File

@ -0,0 +1,67 @@
/**
* A plugin which enables rendering of math equations inside
* of reveal.js slides. Essentially a thin wrapper for MathJax.
*
* @author Hakim El Hattab
*/
var RevealMath = window.RevealMath || (function(){
var options = Reveal.getConfig().math || {};
options.mathjax = options.mathjax || 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js';
options.config = options.config || 'TeX-AMS_HTML-full';
options.tex2jax = options.tex2jax || {
inlineMath: [['$','$'],['\\(','\\)']] ,
skipTags: ['script','noscript','style','textarea','pre'] };
loadScript( options.mathjax + '?config=' + options.config, function() {
MathJax.Hub.Config({
messageStyle: 'none',
tex2jax: options.tex2jax,
skipStartupTypeset: true
});
// Typeset followed by an immediate reveal.js layout since
// the typesetting process could affect slide height
MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub ] );
MathJax.Hub.Queue( Reveal.layout );
// Reprocess equations in slides when they turn visible
Reveal.addEventListener( 'slidechanged', function( event ) {
MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, event.currentSlide ] );
} );
} );
function loadScript( url, callback ) {
var head = document.querySelector( 'head' );
var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.src = url;
// Wrapper for callback to make sure it only fires once
var finish = function() {
if( typeof callback === 'function' ) {
callback.call();
callback = null;
}
}
script.onload = finish;
// IE
script.onreadystatechange = function() {
if ( this.readyState === 'loaded' ) {
finish();
}
}
// Normal browsers
head.appendChild( script );
}
})();

View File

@ -0,0 +1,13 @@
(function() {
var multiplex = Reveal.getConfig().multiplex;
var socketId = multiplex.id;
var socket = io.connect(multiplex.url);
socket.on(multiplex.id, function(data) {
// ignore data from sockets that aren't ours
if (data.socketId !== socketId) { return; }
if( window.location.host === 'localhost:1947' ) return;
Reveal.setState(data.state);
});
}());

64
plugin/multiplex/index.js Normal file
View File

@ -0,0 +1,64 @@
var http = require('http');
var express = require('express');
var fs = require('fs');
var io = require('socket.io');
var crypto = require('crypto');
var app = express();
var staticDir = express.static;
var server = http.createServer(app);
io = io(server);
var opts = {
port: process.env.PORT || 1948,
baseDir : __dirname + '/../../'
};
io.on( 'connection', function( socket ) {
socket.on('multiplex-statechanged', function(data) {
if (typeof data.secret == 'undefined' || data.secret == null || data.secret === '') return;
if (createHash(data.secret) === data.socketId) {
data.secret = null;
socket.broadcast.emit(data.socketId, data);
};
});
});
[ 'css', 'js', 'plugin', 'lib' ].forEach(function(dir) {
app.use('/' + dir, staticDir(opts.baseDir + dir));
});
app.get("/", function(req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
var stream = fs.createReadStream(opts.baseDir + '/index.html');
stream.on('error', function( error ) {
res.write('<style>body{font-family: sans-serif;}</style><h2>reveal.js multiplex server.</h2><a href="/token">Generate token</a>');
res.end();
});
stream.on('readable', function() {
stream.pipe(res);
});
});
app.get("/token", function(req,res) {
var ts = new Date().getTime();
var rand = Math.floor(Math.random()*9999999);
var secret = ts.toString() + rand.toString();
res.send({secret: secret, socketId: createHash(secret)});
});
var createHash = function(secret) {
var cipher = crypto.createCipher('blowfish', secret);
return(cipher.final('hex'));
};
// Actually listen
server.listen( opts.port || null );
var brown = '\033[33m',
green = '\033[32m',
reset = '\033[0m';
console.log( brown + "reveal.js:" + reset + " Multiplex running on port " + green + opts.port + reset );

View File

@ -0,0 +1,34 @@
(function() {
// Don't emit events from inside of notes windows
if ( window.location.search.match( /receiver/gi ) ) { return; }
var multiplex = Reveal.getConfig().multiplex;
var socket = io.connect( multiplex.url );
function post() {
var messageData = {
state: Reveal.getState(),
secret: multiplex.secret,
socketId: multiplex.id
};
socket.emit( 'multiplex-statechanged', messageData );
};
// post once the page is loaded, so the client follows also on "open URL".
window.addEventListener( 'load', post );
// Monitor events that trigger a change in state
Reveal.addEventListener( 'slidechanged', post );
Reveal.addEventListener( 'fragmentshown', post );
Reveal.addEventListener( 'fragmenthidden', post );
Reveal.addEventListener( 'overviewhidden', post );
Reveal.addEventListener( 'overviewshown', post );
Reveal.addEventListener( 'paused', post );
Reveal.addEventListener( 'resumed', post );
}());

View File

@ -0,0 +1,19 @@
{
"name": "reveal-js-multiplex",
"version": "1.0.0",
"description": "reveal.js multiplex server",
"homepage": "http://revealjs.com",
"scripts": {
"start": "node index.js"
},
"engines": {
"node": "~4.1.1"
},
"dependencies": {
"express": "~4.13.3",
"grunt-cli": "~0.1.13",
"mustache": "~2.2.1",
"socket.io": "~1.3.7"
},
"license": "MIT"
}

View File

@ -0,0 +1,65 @@
(function() {
// don't emit events from inside the previews themselves
if( window.location.search.match( /receiver/gi ) ) { return; }
var socket = io.connect( window.location.origin ),
socketId = Math.random().toString().slice( 2 );
console.log( 'View slide notes at ' + window.location.origin + '/notes/' + socketId );
window.open( window.location.origin + '/notes/' + socketId, 'notes-' + socketId );
/**
* Posts the current slide data to the notes window
*/
function post() {
var slideElement = Reveal.getCurrentSlide(),
notesElement = slideElement.querySelector( 'aside.notes' );
var messageData = {
notes: '',
markdown: false,
socketId: socketId,
state: Reveal.getState()
};
// Look for notes defined in a slide attribute
if( slideElement.hasAttribute( 'data-notes' ) ) {
messageData.notes = slideElement.getAttribute( 'data-notes' );
}
// Look for notes defined in an aside element
if( notesElement ) {
messageData.notes = notesElement.innerHTML;
messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string';
}
socket.emit( 'statechanged', messageData );
}
// When a new notes window connects, post our current state
socket.on( 'new-subscriber', function( data ) {
post();
} );
// When the state changes from inside of the speaker view
socket.on( 'statechanged-speaker', function( data ) {
Reveal.setState( data.state );
} );
// Monitor events that trigger a change in state
Reveal.addEventListener( 'slidechanged', post );
Reveal.addEventListener( 'fragmentshown', post );
Reveal.addEventListener( 'fragmenthidden', post );
Reveal.addEventListener( 'overviewhidden', post );
Reveal.addEventListener( 'overviewshown', post );
Reveal.addEventListener( 'paused', post );
Reveal.addEventListener( 'resumed', post );
// Post the initial state
post();
}());

View File

@ -0,0 +1,69 @@
var http = require('http');
var express = require('express');
var fs = require('fs');
var io = require('socket.io');
var Mustache = require('mustache');
var app = express();
var staticDir = express.static;
var server = http.createServer(app);
io = io(server);
var opts = {
port : 1947,
baseDir : __dirname + '/../../'
};
io.on( 'connection', function( socket ) {
socket.on( 'new-subscriber', function( data ) {
socket.broadcast.emit( 'new-subscriber', data );
});
socket.on( 'statechanged', function( data ) {
delete data.state.overview;
socket.broadcast.emit( 'statechanged', data );
});
socket.on( 'statechanged-speaker', function( data ) {
delete data.state.overview;
socket.broadcast.emit( 'statechanged-speaker', data );
});
});
[ 'css', 'js', 'images', 'plugin', 'lib' ].forEach( function( dir ) {
app.use( '/' + dir, staticDir( opts.baseDir + dir ) );
});
app.get('/', function( req, res ) {
res.writeHead( 200, { 'Content-Type': 'text/html' } );
fs.createReadStream( opts.baseDir + '/index.html' ).pipe( res );
});
app.get( '/notes/:socketId', function( req, res ) {
fs.readFile( opts.baseDir + 'plugin/notes-server/notes.html', function( err, data ) {
res.send( Mustache.to_html( data.toString(), {
socketId : req.params.socketId
}));
});
});
// Actually listen
server.listen( opts.port || null );
var brown = '\033[33m',
green = '\033[32m',
reset = '\033[0m';
var slidesLocation = 'http://localhost' + ( opts.port ? ( ':' + opts.port ) : '' );
console.log( brown + 'reveal.js - Speaker Notes' + reset );
console.log( '1. Open the slides at ' + green + slidesLocation + reset );
console.log( '2. Click on the link in your JS console to go to the notes page' );
console.log( '3. Advance through your slides and your notes will advance automatically' );

View File

@ -0,0 +1,585 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>reveal.js - Slide Notes</title>
<style>
body {
font-family: Helvetica;
font-size: 18px;
}
#current-slide,
#upcoming-slide,
#speaker-controls {
padding: 6px;
box-sizing: border-box;
-moz-box-sizing: border-box;
}
#current-slide iframe,
#upcoming-slide iframe {
width: 100%;
height: 100%;
border: 1px solid #ddd;
}
#current-slide .label,
#upcoming-slide .label {
position: absolute;
top: 10px;
left: 10px;
z-index: 2;
}
.overlay-element {
height: 34px;
line-height: 34px;
padding: 0 10px;
text-shadow: none;
background: rgba( 220, 220, 220, 0.8 );
color: #222;
font-size: 14px;
}
.overlay-element.interactive:hover {
background: rgba( 220, 220, 220, 1 );
}
#current-slide {
position: absolute;
width: 60%;
height: 100%;
top: 0;
left: 0;
padding-right: 0;
}
#upcoming-slide {
position: absolute;
width: 40%;
height: 40%;
right: 0;
top: 0;
}
/* Speaker controls */
#speaker-controls {
position: absolute;
top: 40%;
right: 0;
width: 40%;
height: 60%;
overflow: auto;
font-size: 18px;
}
.speaker-controls-time.hidden,
.speaker-controls-notes.hidden {
display: none;
}
.speaker-controls-time .label,
.speaker-controls-notes .label {
text-transform: uppercase;
font-weight: normal;
font-size: 0.66em;
color: #666;
margin: 0;
}
.speaker-controls-time {
border-bottom: 1px solid rgba( 200, 200, 200, 0.5 );
margin-bottom: 10px;
padding: 10px 16px;
padding-bottom: 20px;
cursor: pointer;
}
.speaker-controls-time .reset-button {
opacity: 0;
float: right;
color: #666;
text-decoration: none;
}
.speaker-controls-time:hover .reset-button {
opacity: 1;
}
.speaker-controls-time .timer,
.speaker-controls-time .clock {
width: 50%;
font-size: 1.9em;
}
.speaker-controls-time .timer {
float: left;
}
.speaker-controls-time .clock {
float: right;
text-align: right;
}
.speaker-controls-time span.mute {
color: #bbb;
}
.speaker-controls-notes {
padding: 10px 16px;
}
.speaker-controls-notes .value {
margin-top: 5px;
line-height: 1.4;
font-size: 1.2em;
}
/* Layout selector */
#speaker-layout {
position: absolute;
top: 10px;
right: 10px;
color: #222;
z-index: 10;
}
#speaker-layout select {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
border: 0;
box-shadow: 0;
cursor: pointer;
opacity: 0;
font-size: 1em;
background-color: transparent;
-moz-appearance: none;
-webkit-appearance: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
#speaker-layout select:focus {
outline: none;
box-shadow: none;
}
.clear {
clear: both;
}
/* Speaker layout: Wide */
body[data-speaker-layout="wide"] #current-slide,
body[data-speaker-layout="wide"] #upcoming-slide {
width: 50%;
height: 45%;
padding: 6px;
}
body[data-speaker-layout="wide"] #current-slide {
top: 0;
left: 0;
}
body[data-speaker-layout="wide"] #upcoming-slide {
top: 0;
left: 50%;
}
body[data-speaker-layout="wide"] #speaker-controls {
top: 45%;
left: 0;
width: 100%;
height: 50%;
font-size: 1.25em;
}
/* Speaker layout: Tall */
body[data-speaker-layout="tall"] #current-slide,
body[data-speaker-layout="tall"] #upcoming-slide {
width: 45%;
height: 50%;
padding: 6px;
}
body[data-speaker-layout="tall"] #current-slide {
top: 0;
left: 0;
}
body[data-speaker-layout="tall"] #upcoming-slide {
top: 50%;
left: 0;
}
body[data-speaker-layout="tall"] #speaker-controls {
padding-top: 40px;
top: 0;
left: 45%;
width: 55%;
height: 100%;
font-size: 1.25em;
}
/* Speaker layout: Notes only */
body[data-speaker-layout="notes-only"] #current-slide,
body[data-speaker-layout="notes-only"] #upcoming-slide {
display: none;
}
body[data-speaker-layout="notes-only"] #speaker-controls {
padding-top: 40px;
top: 0;
left: 0;
width: 100%;
height: 100%;
font-size: 1.25em;
}
</style>
</head>
<body>
<div id="current-slide"></div>
<div id="upcoming-slide"><span class="overlay-element label">Upcoming</span></div>
<div id="speaker-controls">
<div class="speaker-controls-time">
<h4 class="label">Time <span class="reset-button">Click to Reset</span></h4>
<div class="clock">
<span class="clock-value">0:00 AM</span>
</div>
<div class="timer">
<span class="hours-value">00</span><span class="minutes-value">:00</span><span class="seconds-value">:00</span>
</div>
<div class="clear"></div>
</div>
<div class="speaker-controls-notes hidden">
<h4 class="label">Notes</h4>
<div class="value"></div>
</div>
</div>
<div id="speaker-layout" class="overlay-element interactive">
<span class="speaker-layout-label"></span>
<select class="speaker-layout-dropdown"></select>
</div>
<script src="/socket.io/socket.io.js"></script>
<script src="/plugin/markdown/marked.js"></script>
<script>
(function() {
var notes,
notesValue,
currentState,
currentSlide,
upcomingSlide,
layoutLabel,
layoutDropdown,
connected = false;
var socket = io.connect( window.location.origin ),
socketId = '{{socketId}}';
var SPEAKER_LAYOUTS = {
'default': 'Default',
'wide': 'Wide',
'tall': 'Tall',
'notes-only': 'Notes only'
};
socket.on( 'statechanged', function( data ) {
// ignore data from sockets that aren't ours
if( data.socketId !== socketId ) { return; }
if( connected === false ) {
connected = true;
setupKeyboard();
setupNotes();
setupTimer();
}
handleStateMessage( data );
} );
setupLayout();
// Load our presentation iframes
setupIframes();
// Once the iframes have loaded, emit a signal saying there's
// a new subscriber which will trigger a 'statechanged'
// message to be sent back
window.addEventListener( 'message', function( event ) {
var data = JSON.parse( event.data );
if( data && data.namespace === 'reveal' ) {
if( /ready/.test( data.eventName ) ) {
socket.emit( 'new-subscriber', { socketId: socketId } );
}
}
// Messages sent by reveal.js inside of the current slide preview
if( data && data.namespace === 'reveal' ) {
if( /slidechanged|fragmentshown|fragmenthidden|overviewshown|overviewhidden|paused|resumed/.test( data.eventName ) && currentState !== JSON.stringify( data.state ) ) {
socket.emit( 'statechanged-speaker', { state: data.state } );
}
}
} );
/**
* Called when the main window sends an updated state.
*/
function handleStateMessage( data ) {
// Store the most recently set state to avoid circular loops
// applying the same state
currentState = JSON.stringify( data.state );
// No need for updating the notes in case of fragment changes
if ( data.notes ) {
notes.classList.remove( 'hidden' );
if( data.markdown ) {
notesValue.innerHTML = marked( data.notes );
}
else {
notesValue.innerHTML = data.notes;
}
}
else {
notes.classList.add( 'hidden' );
}
// Update the note slides
currentSlide.contentWindow.postMessage( JSON.stringify({ method: 'setState', args: [ data.state ] }), '*' );
upcomingSlide.contentWindow.postMessage( JSON.stringify({ method: 'setState', args: [ data.state ] }), '*' );
upcomingSlide.contentWindow.postMessage( JSON.stringify({ method: 'next' }), '*' );
}
// Limit to max one state update per X ms
handleStateMessage = debounce( handleStateMessage, 200 );
/**
* Forward keyboard events to the current slide window.
* This enables keyboard events to work even if focus
* isn't set on the current slide iframe.
*/
function setupKeyboard() {
document.addEventListener( 'keydown', function( event ) {
currentSlide.contentWindow.postMessage( JSON.stringify({ method: 'triggerKey', args: [ event.keyCode ] }), '*' );
} );
}
/**
* Creates the preview iframes.
*/
function setupIframes() {
var params = [
'receiver',
'progress=false',
'history=false',
'transition=none',
'backgroundTransition=none'
].join( '&' );
var currentURL = '/?' + params + '&postMessageEvents=true';
var upcomingURL = '/?' + params + '&controls=false';
currentSlide = document.createElement( 'iframe' );
currentSlide.setAttribute( 'width', 1280 );
currentSlide.setAttribute( 'height', 1024 );
currentSlide.setAttribute( 'src', currentURL );
document.querySelector( '#current-slide' ).appendChild( currentSlide );
upcomingSlide = document.createElement( 'iframe' );
upcomingSlide.setAttribute( 'width', 640 );
upcomingSlide.setAttribute( 'height', 512 );
upcomingSlide.setAttribute( 'src', upcomingURL );
document.querySelector( '#upcoming-slide' ).appendChild( upcomingSlide );
}
/**
* Setup the notes UI.
*/
function setupNotes() {
notes = document.querySelector( '.speaker-controls-notes' );
notesValue = document.querySelector( '.speaker-controls-notes .value' );
}
/**
* Create the timer and clock and start updating them
* at an interval.
*/
function setupTimer() {
var start = new Date(),
timeEl = document.querySelector( '.speaker-controls-time' ),
clockEl = timeEl.querySelector( '.clock-value' ),
hoursEl = timeEl.querySelector( '.hours-value' ),
minutesEl = timeEl.querySelector( '.minutes-value' ),
secondsEl = timeEl.querySelector( '.seconds-value' );
function _updateTimer() {
var diff, hours, minutes, seconds,
now = new Date();
diff = now.getTime() - start.getTime();
hours = Math.floor( diff / ( 1000 * 60 * 60 ) );
minutes = Math.floor( ( diff / ( 1000 * 60 ) ) % 60 );
seconds = Math.floor( ( diff / 1000 ) % 60 );
clockEl.innerHTML = now.toLocaleTimeString( 'en-US', { hour12: true, hour: '2-digit', minute:'2-digit' } );
hoursEl.innerHTML = zeroPadInteger( hours );
hoursEl.className = hours > 0 ? '' : 'mute';
minutesEl.innerHTML = ':' + zeroPadInteger( minutes );
minutesEl.className = minutes > 0 ? '' : 'mute';
secondsEl.innerHTML = ':' + zeroPadInteger( seconds );
}
// Update once directly
_updateTimer();
// Then update every second
setInterval( _updateTimer, 1000 );
timeEl.addEventListener( 'click', function() {
start = new Date();
_updateTimer();
return false;
} );
}
/**
* Sets up the speaker view layout and layout selector.
*/
function setupLayout() {
layoutDropdown = document.querySelector( '.speaker-layout-dropdown' );
layoutLabel = document.querySelector( '.speaker-layout-label' );
// Render the list of available layouts
for( var id in SPEAKER_LAYOUTS ) {
var option = document.createElement( 'option' );
option.setAttribute( 'value', id );
option.textContent = SPEAKER_LAYOUTS[ id ];
layoutDropdown.appendChild( option );
}
// Monitor the dropdown for changes
layoutDropdown.addEventListener( 'change', function( event ) {
setLayout( layoutDropdown.value );
}, false );
// Restore any currently persisted layout
setLayout( getLayout() );
}
/**
* Sets a new speaker view layout. The layout is persisted
* in local storage.
*/
function setLayout( value ) {
var title = SPEAKER_LAYOUTS[ value ];
layoutLabel.innerHTML = 'Layout' + ( title ? ( ': ' + title ) : '' );
layoutDropdown.value = value;
document.body.setAttribute( 'data-speaker-layout', value );
// Persist locally
if( window.localStorage ) {
window.localStorage.setItem( 'reveal-speaker-layout', value );
}
}
/**
* Returns the ID of the most recently set speaker layout
* or our default layout if none has been set.
*/
function getLayout() {
if( window.localStorage ) {
var layout = window.localStorage.getItem( 'reveal-speaker-layout' );
if( layout ) {
return layout;
}
}
// Default to the first record in the layouts hash
for( var id in SPEAKER_LAYOUTS ) {
return id;
}
}
function zeroPadInteger( num ) {
var str = '00' + parseInt( num );
return str.substring( str.length - 2 );
}
/**
* Limits the frequency at which a function can be called.
*/
function debounce( fn, ms ) {
var lastTime = 0,
timeout;
return function() {
var args = arguments;
var context = this;
clearTimeout( timeout );
var timeSinceLastCall = Date.now() - lastTime;
if( timeSinceLastCall > ms ) {
fn.apply( context, args );
lastTime = Date.now();
}
else {
timeout = setTimeout( function() {
fn.apply( context, args );
lastTime = Date.now();
}, ms - timeSinceLastCall );
}
}
}
})();
</script>
</body>
</html>

792
plugin/notes/notes.html Normal file
View File

@ -0,0 +1,792 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>reveal.js - Slide Notes</title>
<style>
body {
font-family: Helvetica;
font-size: 18px;
}
#current-slide,
#upcoming-slide,
#speaker-controls {
padding: 6px;
box-sizing: border-box;
-moz-box-sizing: border-box;
}
#current-slide iframe,
#upcoming-slide iframe {
width: 100%;
height: 100%;
border: 1px solid #ddd;
}
#current-slide .label,
#upcoming-slide .label {
position: absolute;
top: 10px;
left: 10px;
z-index: 2;
}
#connection-status {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 20;
padding: 30% 20% 20% 20%;
font-size: 18px;
color: #222;
background: #fff;
text-align: center;
box-sizing: border-box;
line-height: 1.4;
}
.overlay-element {
height: 34px;
line-height: 34px;
padding: 0 10px;
text-shadow: none;
background: rgba( 220, 220, 220, 0.8 );
color: #222;
font-size: 14px;
}
.overlay-element.interactive:hover {
background: rgba( 220, 220, 220, 1 );
}
#current-slide {
position: absolute;
width: 60%;
height: 100%;
top: 0;
left: 0;
padding-right: 0;
}
#upcoming-slide {
position: absolute;
width: 40%;
height: 40%;
right: 0;
top: 0;
}
/* Speaker controls */
#speaker-controls {
position: absolute;
top: 40%;
right: 0;
width: 40%;
height: 60%;
overflow: auto;
font-size: 18px;
}
.speaker-controls-time.hidden,
.speaker-controls-notes.hidden {
display: none;
}
.speaker-controls-time .label,
.speaker-controls-pace .label,
.speaker-controls-notes .label {
text-transform: uppercase;
font-weight: normal;
font-size: 0.66em;
color: #666;
margin: 0;
}
.speaker-controls-time, .speaker-controls-pace {
border-bottom: 1px solid rgba( 200, 200, 200, 0.5 );
margin-bottom: 10px;
padding: 10px 16px;
padding-bottom: 20px;
cursor: pointer;
}
.speaker-controls-time .reset-button {
opacity: 0;
float: right;
color: #666;
text-decoration: none;
}
.speaker-controls-time:hover .reset-button {
opacity: 1;
}
.speaker-controls-time .timer,
.speaker-controls-time .clock {
width: 50%;
}
.speaker-controls-time .timer,
.speaker-controls-time .clock,
.speaker-controls-time .pacing .hours-value,
.speaker-controls-time .pacing .minutes-value,
.speaker-controls-time .pacing .seconds-value {
font-size: 1.9em;
}
.speaker-controls-time .timer {
float: left;
}
.speaker-controls-time .clock {
float: right;
text-align: right;
}
.speaker-controls-time span.mute {
opacity: 0.3;
}
.speaker-controls-time .pacing-title {
margin-top: 5px;
}
.speaker-controls-time .pacing.ahead {
color: blue;
}
.speaker-controls-time .pacing.on-track {
color: green;
}
.speaker-controls-time .pacing.behind {
color: red;
}
.speaker-controls-notes {
padding: 10px 16px;
}
.speaker-controls-notes .value {
margin-top: 5px;
line-height: 1.4;
font-size: 1.2em;
}
/* Layout selector */
#speaker-layout {
position: absolute;
top: 10px;
right: 10px;
color: #222;
z-index: 10;
}
#speaker-layout select {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
border: 0;
box-shadow: 0;
cursor: pointer;
opacity: 0;
font-size: 1em;
background-color: transparent;
-moz-appearance: none;
-webkit-appearance: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
#speaker-layout select:focus {
outline: none;
box-shadow: none;
}
.clear {
clear: both;
}
/* Speaker layout: Wide */
body[data-speaker-layout="wide"] #current-slide,
body[data-speaker-layout="wide"] #upcoming-slide {
width: 50%;
height: 45%;
padding: 6px;
}
body[data-speaker-layout="wide"] #current-slide {
top: 0;
left: 0;
}
body[data-speaker-layout="wide"] #upcoming-slide {
top: 0;
left: 50%;
}
body[data-speaker-layout="wide"] #speaker-controls {
top: 45%;
left: 0;
width: 100%;
height: 50%;
font-size: 1.25em;
}
/* Speaker layout: Tall */
body[data-speaker-layout="tall"] #current-slide,
body[data-speaker-layout="tall"] #upcoming-slide {
width: 45%;
height: 50%;
padding: 6px;
}
body[data-speaker-layout="tall"] #current-slide {
top: 0;
left: 0;
}
body[data-speaker-layout="tall"] #upcoming-slide {
top: 50%;
left: 0;
}
body[data-speaker-layout="tall"] #speaker-controls {
padding-top: 40px;
top: 0;
left: 45%;
width: 55%;
height: 100%;
font-size: 1.25em;
}
/* Speaker layout: Notes only */
body[data-speaker-layout="notes-only"] #current-slide,
body[data-speaker-layout="notes-only"] #upcoming-slide {
display: none;
}
body[data-speaker-layout="notes-only"] #speaker-controls {
padding-top: 40px;
top: 0;
left: 0;
width: 100%;
height: 100%;
font-size: 1.25em;
}
@media screen and (max-width: 1080px) {
body[data-speaker-layout="default"] #speaker-controls {
font-size: 16px;
}
}
@media screen and (max-width: 900px) {
body[data-speaker-layout="default"] #speaker-controls {
font-size: 14px;
}
}
@media screen and (max-width: 800px) {
body[data-speaker-layout="default"] #speaker-controls {
font-size: 12px;
}
}
</style>
</head>
<body>
<div id="connection-status">Loading speaker view...</div>
<div id="current-slide"></div>
<div id="upcoming-slide"><span class="overlay-element label">Upcoming</span></div>
<div id="speaker-controls">
<div class="speaker-controls-time">
<h4 class="label">Time <span class="reset-button">Click to Reset</span></h4>
<div class="clock">
<span class="clock-value">0:00 AM</span>
</div>
<div class="timer">
<span class="hours-value">00</span><span class="minutes-value">:00</span><span class="seconds-value">:00</span>
</div>
<div class="clear"></div>
<h4 class="label pacing-title" style="display: none">Pacing Time to finish current slide</h4>
<div class="pacing" style="display: none">
<span class="hours-value">00</span><span class="minutes-value">:00</span><span class="seconds-value">:00</span>
</div>
</div>
<div class="speaker-controls-notes hidden">
<h4 class="label">Notes</h4>
<div class="value"></div>
</div>
</div>
<div id="speaker-layout" class="overlay-element interactive">
<span class="speaker-layout-label"></span>
<select class="speaker-layout-dropdown"></select>
</div>
<script src="../../plugin/markdown/marked.js"></script>
<script>
(function() {
var notes,
notesValue,
currentState,
currentSlide,
upcomingSlide,
layoutLabel,
layoutDropdown,
connected = false;
var SPEAKER_LAYOUTS = {
'default': 'Default',
'wide': 'Wide',
'tall': 'Tall',
'notes-only': 'Notes only'
};
setupLayout();
var connectionStatus = document.querySelector( '#connection-status' );
var connectionTimeout = setTimeout( function() {
connectionStatus.innerHTML = 'Error connecting to main window.<br>Please try closing and reopening the speaker view.';
}, 5000 );
window.addEventListener( 'message', function( event ) {
clearTimeout( connectionTimeout );
connectionStatus.style.display = 'none';
var data = JSON.parse( event.data );
// The overview mode is only useful to the reveal.js instance
// where navigation occurs so we don't sync it
if( data.state ) delete data.state.overview;
// Messages sent by the notes plugin inside of the main window
if( data && data.namespace === 'reveal-notes' ) {
if( data.type === 'connect' ) {
handleConnectMessage( data );
}
else if( data.type === 'state' ) {
handleStateMessage( data );
}
}
// Messages sent by the reveal.js inside of the current slide preview
else if( data && data.namespace === 'reveal' ) {
if( /ready/.test( data.eventName ) ) {
// Send a message back to notify that the handshake is complete
window.opener.postMessage( JSON.stringify({ namespace: 'reveal-notes', type: 'connected'} ), '*' );
}
else if( /slidechanged|fragmentshown|fragmenthidden|paused|resumed/.test( data.eventName ) && currentState !== JSON.stringify( data.state ) ) {
window.opener.postMessage( JSON.stringify({ method: 'setState', args: [ data.state ]} ), '*' );
}
}
} );
/**
* Called when the main window is trying to establish a
* connection.
*/
function handleConnectMessage( data ) {
if( connected === false ) {
connected = true;
setupIframes( data );
setupKeyboard();
setupNotes();
setupTimer();
}
}
/**
* Called when the main window sends an updated state.
*/
function handleStateMessage( data ) {
// Store the most recently set state to avoid circular loops
// applying the same state
currentState = JSON.stringify( data.state );
// No need for updating the notes in case of fragment changes
if ( data.notes ) {
notes.classList.remove( 'hidden' );
notesValue.style.whiteSpace = data.whitespace;
if( data.markdown ) {
notesValue.innerHTML = marked( data.notes );
}
else {
notesValue.innerHTML = data.notes;
}
}
else {
notes.classList.add( 'hidden' );
}
// Update the note slides
currentSlide.contentWindow.postMessage( JSON.stringify({ method: 'setState', args: [ data.state ] }), '*' );
upcomingSlide.contentWindow.postMessage( JSON.stringify({ method: 'setState', args: [ data.state ] }), '*' );
upcomingSlide.contentWindow.postMessage( JSON.stringify({ method: 'next' }), '*' );
}
// Limit to max one state update per X ms
handleStateMessage = debounce( handleStateMessage, 200 );
/**
* Forward keyboard events to the current slide window.
* This enables keyboard events to work even if focus
* isn't set on the current slide iframe.
*
* Block F5 default handling, it reloads and disconnects
* the speaker notes window.
*/
function setupKeyboard() {
document.addEventListener( 'keydown', function( event ) {
if( event.keyCode === 116 || ( event.metaKey && event.keyCode === 82 ) ) {
event.preventDefault();
return false;
}
currentSlide.contentWindow.postMessage( JSON.stringify({ method: 'triggerKey', args: [ event.keyCode ] }), '*' );
} );
}
/**
* Creates the preview iframes.
*/
function setupIframes( data ) {
var params = [
'receiver',
'progress=false',
'history=false',
'transition=none',
'autoSlide=0',
'backgroundTransition=none'
].join( '&' );
var urlSeparator = /\?/.test(data.url) ? '&' : '?';
var hash = '#/' + data.state.indexh + '/' + data.state.indexv;
var currentURL = data.url + urlSeparator + params + '&postMessageEvents=true' + hash;
var upcomingURL = data.url + urlSeparator + params + '&controls=false' + hash;
currentSlide = document.createElement( 'iframe' );
currentSlide.setAttribute( 'width', 1280 );
currentSlide.setAttribute( 'height', 1024 );
currentSlide.setAttribute( 'src', currentURL );
document.querySelector( '#current-slide' ).appendChild( currentSlide );
upcomingSlide = document.createElement( 'iframe' );
upcomingSlide.setAttribute( 'width', 640 );
upcomingSlide.setAttribute( 'height', 512 );
upcomingSlide.setAttribute( 'src', upcomingURL );
document.querySelector( '#upcoming-slide' ).appendChild( upcomingSlide );
}
/**
* Setup the notes UI.
*/
function setupNotes() {
notes = document.querySelector( '.speaker-controls-notes' );
notesValue = document.querySelector( '.speaker-controls-notes .value' );
}
function getTimings() {
var slides = Reveal.getSlides();
var defaultTiming = Reveal.getConfig().defaultTiming;
if (defaultTiming == null) {
return null;
}
var timings = [];
for ( var i in slides ) {
var slide = slides[i];
var timing = defaultTiming;
if( slide.hasAttribute( 'data-timing' )) {
var t = slide.getAttribute( 'data-timing' );
timing = parseInt(t);
if( isNaN(timing) ) {
console.warn("Could not parse timing '" + t + "' of slide " + i + "; using default of " + defaultTiming);
timing = defaultTiming;
}
}
timings.push(timing);
}
return timings;
}
/**
* Return the number of seconds allocated for presenting
* all slides up to and including this one.
*/
function getTimeAllocated(timings) {
var slides = Reveal.getSlides();
var allocated = 0;
var currentSlide = Reveal.getSlidePastCount();
for (var i in slides.slice(0, currentSlide + 1)) {
allocated += timings[i];
}
return allocated;
}
/**
* Create the timer and clock and start updating them
* at an interval.
*/
function setupTimer() {
var start = new Date(),
timeEl = document.querySelector( '.speaker-controls-time' ),
clockEl = timeEl.querySelector( '.clock-value' ),
hoursEl = timeEl.querySelector( '.hours-value' ),
minutesEl = timeEl.querySelector( '.minutes-value' ),
secondsEl = timeEl.querySelector( '.seconds-value' ),
pacingTitleEl = timeEl.querySelector( '.pacing-title' ),
pacingEl = timeEl.querySelector( '.pacing' ),
pacingHoursEl = pacingEl.querySelector( '.hours-value' ),
pacingMinutesEl = pacingEl.querySelector( '.minutes-value' ),
pacingSecondsEl = pacingEl.querySelector( '.seconds-value' );
var timings = getTimings();
if (timings !== null) {
pacingTitleEl.style.removeProperty('display');
pacingEl.style.removeProperty('display');
}
function _displayTime( hrEl, minEl, secEl, time) {
var sign = Math.sign(time) == -1 ? "-" : "";
time = Math.abs(Math.round(time / 1000));
var seconds = time % 60;
var minutes = Math.floor( time / 60 ) % 60 ;
var hours = Math.floor( time / ( 60 * 60 )) ;
hrEl.innerHTML = sign + zeroPadInteger( hours );
if (hours == 0) {
hrEl.classList.add( 'mute' );
}
else {
hrEl.classList.remove( 'mute' );
}
minEl.innerHTML = ':' + zeroPadInteger( minutes );
if (hours == 0 && minutes == 0) {
minEl.classList.add( 'mute' );
}
else {
minEl.classList.remove( 'mute' );
}
secEl.innerHTML = ':' + zeroPadInteger( seconds );
}
function _updateTimer() {
var diff, hours, minutes, seconds,
now = new Date();
diff = now.getTime() - start.getTime();
clockEl.innerHTML = now.toLocaleTimeString( 'en-US', { hour12: true, hour: '2-digit', minute:'2-digit' } );
_displayTime( hoursEl, minutesEl, secondsEl, diff );
if (timings !== null) {
_updatePacing(diff);
}
}
function _updatePacing(diff) {
var slideEndTiming = getTimeAllocated(timings) * 1000;
var currentSlide = Reveal.getSlidePastCount();
var currentSlideTiming = timings[currentSlide] * 1000;
var timeLeftCurrentSlide = slideEndTiming - diff;
if (timeLeftCurrentSlide < 0) {
pacingEl.className = 'pacing behind';
}
else if (timeLeftCurrentSlide < currentSlideTiming) {
pacingEl.className = 'pacing on-track';
}
else {
pacingEl.className = 'pacing ahead';
}
_displayTime( pacingHoursEl, pacingMinutesEl, pacingSecondsEl, timeLeftCurrentSlide );
}
// Update once directly
_updateTimer();
// Then update every second
setInterval( _updateTimer, 1000 );
function _resetTimer() {
if (timings == null) {
start = new Date();
}
else {
// Reset timer to beginning of current slide
var slideEndTiming = getTimeAllocated(timings) * 1000;
var currentSlide = Reveal.getSlidePastCount();
var currentSlideTiming = timings[currentSlide] * 1000;
var previousSlidesTiming = slideEndTiming - currentSlideTiming;
var now = new Date();
start = new Date(now.getTime() - previousSlidesTiming);
}
_updateTimer();
}
timeEl.addEventListener( 'click', function() {
_resetTimer();
return false;
} );
}
/**
* Sets up the speaker view layout and layout selector.
*/
function setupLayout() {
layoutDropdown = document.querySelector( '.speaker-layout-dropdown' );
layoutLabel = document.querySelector( '.speaker-layout-label' );
// Render the list of available layouts
for( var id in SPEAKER_LAYOUTS ) {
var option = document.createElement( 'option' );
option.setAttribute( 'value', id );
option.textContent = SPEAKER_LAYOUTS[ id ];
layoutDropdown.appendChild( option );
}
// Monitor the dropdown for changes
layoutDropdown.addEventListener( 'change', function( event ) {
setLayout( layoutDropdown.value );
}, false );
// Restore any currently persisted layout
setLayout( getLayout() );
}
/**
* Sets a new speaker view layout. The layout is persisted
* in local storage.
*/
function setLayout( value ) {
var title = SPEAKER_LAYOUTS[ value ];
layoutLabel.innerHTML = 'Layout' + ( title ? ( ': ' + title ) : '' );
layoutDropdown.value = value;
document.body.setAttribute( 'data-speaker-layout', value );
// Persist locally
if( supportsLocalStorage() ) {
window.localStorage.setItem( 'reveal-speaker-layout', value );
}
}
/**
* Returns the ID of the most recently set speaker layout
* or our default layout if none has been set.
*/
function getLayout() {
if( supportsLocalStorage() ) {
var layout = window.localStorage.getItem( 'reveal-speaker-layout' );
if( layout ) {
return layout;
}
}
// Default to the first record in the layouts hash
for( var id in SPEAKER_LAYOUTS ) {
return id;
}
}
function supportsLocalStorage() {
try {
localStorage.setItem('test', 'test');
localStorage.removeItem('test');
return true;
}
catch( e ) {
return false;
}
}
function zeroPadInteger( num ) {
var str = '00' + parseInt( num );
return str.substring( str.length - 2 );
}
/**
* Limits the frequency at which a function can be called.
*/
function debounce( fn, ms ) {
var lastTime = 0,
timeout;
return function() {
var args = arguments;
var context = this;
clearTimeout( timeout );
var timeSinceLastCall = Date.now() - lastTime;
if( timeSinceLastCall > ms ) {
fn.apply( context, args );
lastTime = Date.now();
}
else {
timeout = setTimeout( function() {
fn.apply( context, args );
lastTime = Date.now();
}, ms - timeSinceLastCall );
}
}
}
})();
</script>
</body>
</html>

147
plugin/notes/notes.js Normal file
View File

@ -0,0 +1,147 @@
/**
* Handles opening of and synchronization with the reveal.js
* notes window.
*
* Handshake process:
* 1. This window posts 'connect' to notes window
* - Includes URL of presentation to show
* 2. Notes window responds with 'connected' when it is available
* 3. This window proceeds to send the current presentation state
* to the notes window
*/
var RevealNotes = (function() {
function openNotes( notesFilePath ) {
if( !notesFilePath ) {
var jsFileLocation = document.querySelector('script[src$="notes.js"]').src; // this js file path
jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, ''); // the js folder path
notesFilePath = jsFileLocation + 'notes.html';
}
var notesPopup = window.open( notesFilePath, 'reveal.js - Notes', 'width=1100,height=700' );
if( !notesPopup ) {
alert( 'Speaker view popup failed to open. Please make sure popups are allowed and reopen the speaker view.' );
return;
}
// Allow popup window access to Reveal API
notesPopup.Reveal = window.Reveal;
/**
* Connect to the notes window through a postmessage handshake.
* Using postmessage enables us to work in situations where the
* origins differ, such as a presentation being opened from the
* file system.
*/
function connect() {
// Keep trying to connect until we get a 'connected' message back
var connectInterval = setInterval( function() {
notesPopup.postMessage( JSON.stringify( {
namespace: 'reveal-notes',
type: 'connect',
url: window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search,
state: Reveal.getState()
} ), '*' );
}, 500 );
window.addEventListener( 'message', function( event ) {
var data = JSON.parse( event.data );
if( data && data.namespace === 'reveal-notes' && data.type === 'connected' ) {
clearInterval( connectInterval );
onConnected();
}
} );
}
/**
* Posts the current slide data to the notes window
*/
function post( event ) {
var slideElement = Reveal.getCurrentSlide(),
notesElement = slideElement.querySelector( 'aside.notes' ),
fragmentElement = slideElement.querySelector( '.current-fragment' );
var messageData = {
namespace: 'reveal-notes',
type: 'state',
notes: '',
markdown: false,
whitespace: 'normal',
state: Reveal.getState()
};
// Look for notes defined in a slide attribute
if( slideElement.hasAttribute( 'data-notes' ) ) {
messageData.notes = slideElement.getAttribute( 'data-notes' );
messageData.whitespace = 'pre-wrap';
}
// Look for notes defined in a fragment
if( fragmentElement ) {
var fragmentNotes = fragmentElement.querySelector( 'aside.notes' );
if( fragmentNotes ) {
notesElement = fragmentNotes;
}
else if( fragmentElement.hasAttribute( 'data-notes' ) ) {
messageData.notes = fragmentElement.getAttribute( 'data-notes' );
messageData.whitespace = 'pre-wrap';
// In case there are slide notes
notesElement = null;
}
}
// Look for notes defined in an aside element
if( notesElement ) {
messageData.notes = notesElement.innerHTML;
messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string';
}
notesPopup.postMessage( JSON.stringify( messageData ), '*' );
}
/**
* Called once we have established a connection to the notes
* window.
*/
function onConnected() {
// Monitor events that trigger a change in state
Reveal.addEventListener( 'slidechanged', post );
Reveal.addEventListener( 'fragmentshown', post );
Reveal.addEventListener( 'fragmenthidden', post );
Reveal.addEventListener( 'overviewhidden', post );
Reveal.addEventListener( 'overviewshown', post );
Reveal.addEventListener( 'paused', post );
Reveal.addEventListener( 'resumed', post );
// Post the initial state
post();
}
connect();
}
if( !/receiver/i.test( window.location.search ) ) {
// If the there's a 'notes' query set, open directly
if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) {
openNotes();
}
// Open the notes when the 's' key is hit
Reveal.addKeyBinding({keyCode: 83, key: 'S', description: 'Speaker notes view'}, function() {
openNotes();
} );
}
return { open: openNotes };
})();

View File

@ -0,0 +1,67 @@
/**
* phantomjs script for printing presentations to PDF.
*
* Example:
* phantomjs print-pdf.js "http://revealjs.com?print-pdf" reveal-demo.pdf
*
* @author Manuel Bieh (https://github.com/manuelbieh)
* @author Hakim El Hattab (https://github.com/hakimel)
* @author Manuel Riezebosch (https://github.com/riezebosch)
*/
// html2pdf.js
var system = require( 'system' );
var probePage = new WebPage();
var printPage = new WebPage();
var inputFile = system.args[1] || 'index.html?print-pdf';
var outputFile = system.args[2] || 'slides.pdf';
if( outputFile.match( /\.pdf$/gi ) === null ) {
outputFile += '.pdf';
}
console.log( 'Export PDF: Reading reveal.js config [1/4]' );
probePage.open( inputFile, function( status ) {
console.log( 'Export PDF: Preparing print layout [2/4]' );
var config = probePage.evaluate( function() {
return Reveal.getConfig();
} );
if( config ) {
printPage.paperSize = {
width: Math.floor( config.width * ( 1 + config.margin ) ),
height: Math.floor( config.height * ( 1 + config.margin ) ),
border: 0
};
printPage.open( inputFile, function( status ) {
console.log( 'Export PDF: Preparing pdf [3/4]')
printPage.evaluate( function() {
Reveal.isReady() ? window.callPhantom() : Reveal.addEventListener( 'pdf-ready', window.callPhantom );
} );
} );
printPage.onCallback = function( data ) {
// For some reason we need to "jump the queue" for syntax highlighting to work.
// See: http://stackoverflow.com/a/3580132/129269
setTimeout( function() {
console.log( 'Export PDF: Writing file [4/4]' );
printPage.render( outputFile );
console.log( 'Export PDF: Finished successfully!' );
phantom.exit();
}, 0 );
};
}
else {
console.log( 'Export PDF: Unable to read reveal.js config. Make sure the input address points to a reveal.js page.' );
phantom.exit( 1 );
}
} );

206
plugin/search/search.js Normal file
View File

@ -0,0 +1,206 @@
/*
* Handles finding a text string anywhere in the slides and showing the next occurrence to the user
* by navigatating to that slide and highlighting it.
*
* By Jon Snyder <snyder.jon@gmail.com>, February 2013
*/
var RevealSearch = (function() {
var matchedSlides;
var currentMatchedIndex;
var searchboxDirty;
var myHilitor;
// Original JavaScript code by Chirp Internet: www.chirp.com.au
// Please acknowledge use of this code by including this header.
// 2/2013 jon: modified regex to display any match, not restricted to word boundaries.
function Hilitor(id, tag)
{
var targetNode = document.getElementById(id) || document.body;
var hiliteTag = tag || "EM";
var skipTags = new RegExp("^(?:" + hiliteTag + "|SCRIPT|FORM)$");
var colors = ["#ff6", "#a0ffff", "#9f9", "#f99", "#f6f"];
var wordColor = [];
var colorIdx = 0;
var matchRegex = "";
var matchingSlides = [];
this.setRegex = function(input)
{
input = input.replace(/^[^\w]+|[^\w]+$/g, "").replace(/[^\w'-]+/g, "|");
matchRegex = new RegExp("(" + input + ")","i");
}
this.getRegex = function()
{
return matchRegex.toString().replace(/^\/\\b\(|\)\\b\/i$/g, "").replace(/\|/g, " ");
}
// recursively apply word highlighting
this.hiliteWords = function(node)
{
if(node == undefined || !node) return;
if(!matchRegex) return;
if(skipTags.test(node.nodeName)) return;
if(node.hasChildNodes()) {
for(var i=0; i < node.childNodes.length; i++)
this.hiliteWords(node.childNodes[i]);
}
if(node.nodeType == 3) { // NODE_TEXT
if((nv = node.nodeValue) && (regs = matchRegex.exec(nv))) {
//find the slide's section element and save it in our list of matching slides
var secnode = node;
while (secnode != null && secnode.nodeName != 'SECTION') {
secnode = secnode.parentNode;
}
var slideIndex = Reveal.getIndices(secnode);
var slidelen = matchingSlides.length;
var alreadyAdded = false;
for (var i=0; i < slidelen; i++) {
if ( (matchingSlides[i].h === slideIndex.h) && (matchingSlides[i].v === slideIndex.v) ) {
alreadyAdded = true;
}
}
if (! alreadyAdded) {
matchingSlides.push(slideIndex);
}
if(!wordColor[regs[0].toLowerCase()]) {
wordColor[regs[0].toLowerCase()] = colors[colorIdx++ % colors.length];
}
var match = document.createElement(hiliteTag);
match.appendChild(document.createTextNode(regs[0]));
match.style.backgroundColor = wordColor[regs[0].toLowerCase()];
match.style.fontStyle = "inherit";
match.style.color = "#000";
var after = node.splitText(regs.index);
after.nodeValue = after.nodeValue.substring(regs[0].length);
node.parentNode.insertBefore(match, after);
}
}
};
// remove highlighting
this.remove = function()
{
var arr = document.getElementsByTagName(hiliteTag);
while(arr.length && (el = arr[0])) {
el.parentNode.replaceChild(el.firstChild, el);
}
};
// start highlighting at target node
this.apply = function(input)
{
if(input == undefined || !input) return;
this.remove();
this.setRegex(input);
this.hiliteWords(targetNode);
return matchingSlides;
};
}
function openSearch() {
//ensure the search term input dialog is visible and has focus:
var inputboxdiv = document.getElementById("searchinputdiv");
var inputbox = document.getElementById("searchinput");
inputboxdiv.style.display = "inline";
inputbox.focus();
inputbox.select();
}
function closeSearch() {
var inputboxdiv = document.getElementById("searchinputdiv");
inputboxdiv.style.display = "none";
if(myHilitor) myHilitor.remove();
}
function toggleSearch() {
var inputboxdiv = document.getElementById("searchinputdiv");
if (inputboxdiv.style.display !== "inline") {
openSearch();
}
else {
closeSearch();
}
}
function doSearch() {
//if there's been a change in the search term, perform a new search:
if (searchboxDirty) {
var searchstring = document.getElementById("searchinput").value;
if (searchstring === '') {
if(myHilitor) myHilitor.remove();
matchedSlides = null;
}
else {
//find the keyword amongst the slides
myHilitor = new Hilitor("slidecontent");
matchedSlides = myHilitor.apply(searchstring);
currentMatchedIndex = 0;
}
}
if (matchedSlides) {
//navigate to the next slide that has the keyword, wrapping to the first if necessary
if (matchedSlides.length && (matchedSlides.length <= currentMatchedIndex)) {
currentMatchedIndex = 0;
}
if (matchedSlides.length > currentMatchedIndex) {
Reveal.slide(matchedSlides[currentMatchedIndex].h, matchedSlides[currentMatchedIndex].v);
currentMatchedIndex++;
}
}
}
var dom = {};
dom.wrapper = document.querySelector( '.reveal' );
if( !dom.wrapper.querySelector( '.searchbox' ) ) {
var searchElement = document.createElement( 'div' );
searchElement.id = "searchinputdiv";
searchElement.classList.add( 'searchdiv' );
searchElement.style.position = 'absolute';
searchElement.style.top = '10px';
searchElement.style.right = '10px';
searchElement.style.zIndex = 10;
//embedded base64 search icon Designed by Sketchdock - http://www.sketchdock.com/:
searchElement.innerHTML = '<span><input type="search" id="searchinput" class="searchinput" style="vertical-align: top;"/><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJiSURBVHjatFZNaxNBGH5md+Mmu92NVdKDRipSAyqCghgQD4L4cRe86UUtAQ+eFCxoa4/25EXBFi8eBE+eRPoDhB6KgiiixdAPCEkx2pjvTXadd9yNsflwuyUDD/O+u8PzzDPvzOwyx3EwyCZhwG3gAkp7MnpjgbopjsltcD4gjuXZZKeAR348MYLYTm3LzOs/y3j3JTfZxgXWXmTuwPHIc4VmoOmv5IrI53+AO2DdHLjkDWQ3GoEEVFXtXQOvkSnPWcyUceviLhwbDYv8/XIVj97kse7TodLvZXxYxrPUHkQ1ufXs3FEdybEIxucySOesoNvUgWU1cP3MkCBfTFdw9fGaAMVmRELq7LBw2Q3/FaAxxWIRpw+ZIr/7IouPqzUBiqmdHAv7EuhRAwf1er2Vy4x1jW3b2d5Jfvu5IPp7l2LYbcgCFFNb+FoJ7oBqEAqFMPNqFcmEgVMJDfMT+1tvN0pNjERlMS6QA5pFOKxiKVPFhakPeL3It+WGJUDxt2wFR+JhzI7v5ctkd8DXOZAkCYYxhO+lKm4+Xfqz/rIixBuNBl7eOYzkQQNzqX249mRl6zUgEcYkaJrGhUwBinVdh6IouPzwE6/DL5w4oLkH8y981aDf+uq6hlKpJESiUdNfDZi7/ehG9K6KfiA3pml0PLcsq+cSMTj2NL9ukc4UOmz7AZ3+crkC4mHujFvXNaMFB3bEr8xPS6p5O+jXxq4VZtaen7/PwzrntjcLUE0iHPS1Ud1cdiEJl/8WivZk0wXd7zWOMkeF8s0CcAmkNrC2nvXZDbbbN73ccYnZoH9bfgswAFzAe9/h3dbKAAAAAElFTkSuQmCC" id="searchbutton" class="searchicon" style="vertical-align: top; margin-top: -1px;"/></span>';
dom.wrapper.appendChild( searchElement );
}
document.getElementById( 'searchbutton' ).addEventListener( 'click', function(event) {
doSearch();
}, false );
document.getElementById( 'searchinput' ).addEventListener( 'keyup', function( event ) {
switch (event.keyCode) {
case 13:
event.preventDefault();
doSearch();
searchboxDirty = false;
break;
default:
searchboxDirty = true;
}
}, false );
document.addEventListener( 'keydown', function( event ) {
if( event.key == "F" && (event.ctrlKey || event.metaKey) ) { //Control+Shift+f
event.preventDefault();
toggleSearch();
}
}, false );
if( window.Reveal ) Reveal.registerKeyboardShortcut( 'Ctrl-Shift-F', 'Search' );
closeSearch();
return { open: openSearch };
})();

272
plugin/zoom-js/zoom.js Normal file
View File

@ -0,0 +1,272 @@
// Custom reveal.js integration
(function(){
var revealElement = document.querySelector( '.reveal' );
if( revealElement ) {
revealElement.addEventListener( 'mousedown', function( event ) {
var defaultModifier = /Linux/.test( window.navigator.platform ) ? 'ctrl' : 'alt';
var modifier = ( Reveal.getConfig().zoomKey ? Reveal.getConfig().zoomKey : defaultModifier ) + 'Key';
var zoomLevel = ( Reveal.getConfig().zoomLevel ? Reveal.getConfig().zoomLevel : 2 );
if( event[ modifier ] && !Reveal.isOverview() ) {
event.preventDefault();
zoom.to({
x: event.clientX,
y: event.clientY,
scale: zoomLevel,
pan: false
});
}
} );
}
})();
/*!
* zoom.js 0.3 (modified for use with reveal.js)
* http://lab.hakim.se/zoom-js
* MIT licensed
*
* Copyright (C) 2011-2014 Hakim El Hattab, http://hakim.se
*/
var zoom = (function(){
// The current zoom level (scale)
var level = 1;
// The current mouse position, used for panning
var mouseX = 0,
mouseY = 0;
// Timeout before pan is activated
var panEngageTimeout = -1,
panUpdateInterval = -1;
// Check for transform support so that we can fallback otherwise
var supportsTransforms = 'WebkitTransform' in document.body.style ||
'MozTransform' in document.body.style ||
'msTransform' in document.body.style ||
'OTransform' in document.body.style ||
'transform' in document.body.style;
if( supportsTransforms ) {
// The easing that will be applied when we zoom in/out
document.body.style.transition = 'transform 0.8s ease';
document.body.style.OTransition = '-o-transform 0.8s ease';
document.body.style.msTransition = '-ms-transform 0.8s ease';
document.body.style.MozTransition = '-moz-transform 0.8s ease';
document.body.style.WebkitTransition = '-webkit-transform 0.8s ease';
}
// Zoom out if the user hits escape
document.addEventListener( 'keyup', function( event ) {
if( level !== 1 && event.keyCode === 27 ) {
zoom.out();
}
} );
// Monitor mouse movement for panning
document.addEventListener( 'mousemove', function( event ) {
if( level !== 1 ) {
mouseX = event.clientX;
mouseY = event.clientY;
}
} );
/**
* Applies the CSS required to zoom in, prefers the use of CSS3
* transforms but falls back on zoom for IE.
*
* @param {Object} rect
* @param {Number} scale
*/
function magnify( rect, scale ) {
var scrollOffset = getScrollOffset();
// Ensure a width/height is set
rect.width = rect.width || 1;
rect.height = rect.height || 1;
// Center the rect within the zoomed viewport
rect.x -= ( window.innerWidth - ( rect.width * scale ) ) / 2;
rect.y -= ( window.innerHeight - ( rect.height * scale ) ) / 2;
if( supportsTransforms ) {
// Reset
if( scale === 1 ) {
document.body.style.transform = '';
document.body.style.OTransform = '';
document.body.style.msTransform = '';
document.body.style.MozTransform = '';
document.body.style.WebkitTransform = '';
}
// Scale
else {
var origin = scrollOffset.x +'px '+ scrollOffset.y +'px',
transform = 'translate('+ -rect.x +'px,'+ -rect.y +'px) scale('+ scale +')';
document.body.style.transformOrigin = origin;
document.body.style.OTransformOrigin = origin;
document.body.style.msTransformOrigin = origin;
document.body.style.MozTransformOrigin = origin;
document.body.style.WebkitTransformOrigin = origin;
document.body.style.transform = transform;
document.body.style.OTransform = transform;
document.body.style.msTransform = transform;
document.body.style.MozTransform = transform;
document.body.style.WebkitTransform = transform;
}
}
else {
// Reset
if( scale === 1 ) {
document.body.style.position = '';
document.body.style.left = '';
document.body.style.top = '';
document.body.style.width = '';
document.body.style.height = '';
document.body.style.zoom = '';
}
// Scale
else {
document.body.style.position = 'relative';
document.body.style.left = ( - ( scrollOffset.x + rect.x ) / scale ) + 'px';
document.body.style.top = ( - ( scrollOffset.y + rect.y ) / scale ) + 'px';
document.body.style.width = ( scale * 100 ) + '%';
document.body.style.height = ( scale * 100 ) + '%';
document.body.style.zoom = scale;
}
}
level = scale;
if( document.documentElement.classList ) {
if( level !== 1 ) {
document.documentElement.classList.add( 'zoomed' );
}
else {
document.documentElement.classList.remove( 'zoomed' );
}
}
}
/**
* Pan the document when the mosue cursor approaches the edges
* of the window.
*/
function pan() {
var range = 0.12,
rangeX = window.innerWidth * range,
rangeY = window.innerHeight * range,
scrollOffset = getScrollOffset();
// Up
if( mouseY < rangeY ) {
window.scroll( scrollOffset.x, scrollOffset.y - ( 1 - ( mouseY / rangeY ) ) * ( 14 / level ) );
}
// Down
else if( mouseY > window.innerHeight - rangeY ) {
window.scroll( scrollOffset.x, scrollOffset.y + ( 1 - ( window.innerHeight - mouseY ) / rangeY ) * ( 14 / level ) );
}
// Left
if( mouseX < rangeX ) {
window.scroll( scrollOffset.x - ( 1 - ( mouseX / rangeX ) ) * ( 14 / level ), scrollOffset.y );
}
// Right
else if( mouseX > window.innerWidth - rangeX ) {
window.scroll( scrollOffset.x + ( 1 - ( window.innerWidth - mouseX ) / rangeX ) * ( 14 / level ), scrollOffset.y );
}
}
function getScrollOffset() {
return {
x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset,
y: window.scrollY !== undefined ? window.scrollY : window.pageYOffset
}
}
return {
/**
* Zooms in on either a rectangle or HTML element.
*
* @param {Object} options
* - element: HTML element to zoom in on
* OR
* - x/y: coordinates in non-transformed space to zoom in on
* - width/height: the portion of the screen to zoom in on
* - scale: can be used instead of width/height to explicitly set scale
*/
to: function( options ) {
// Due to an implementation limitation we can't zoom in
// to another element without zooming out first
if( level !== 1 ) {
zoom.out();
}
else {
options.x = options.x || 0;
options.y = options.y || 0;
// If an element is set, that takes precedence
if( !!options.element ) {
// Space around the zoomed in element to leave on screen
var padding = 20;
var bounds = options.element.getBoundingClientRect();
options.x = bounds.left - padding;
options.y = bounds.top - padding;
options.width = bounds.width + ( padding * 2 );
options.height = bounds.height + ( padding * 2 );
}
// If width/height values are set, calculate scale from those values
if( options.width !== undefined && options.height !== undefined ) {
options.scale = Math.max( Math.min( window.innerWidth / options.width, window.innerHeight / options.height ), 1 );
}
if( options.scale > 1 ) {
options.x *= options.scale;
options.y *= options.scale;
magnify( options, options.scale );
if( options.pan !== false ) {
// Wait with engaging panning as it may conflict with the
// zoom transition
panEngageTimeout = setTimeout( function() {
panUpdateInterval = setInterval( pan, 1000 / 60 );
}, 800 );
}
}
}
},
/**
* Resets the document zoom state to its default.
*/
out: function() {
clearTimeout( panEngageTimeout );
clearInterval( panUpdateInterval );
magnify( { x: 0, y: 0 }, 1 );
level = 1;
},
// Alias
magnify: function( options ) { this.to( options ) },
reset: function() { this.out() },
zoomLevel: function() {
return level;
}
}
})();

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,41 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>reveal.js - Barebones</title>
<link rel="stylesheet" href="../../css/reveal.css">
</head>
<body>
<div class="reveal">
<div class="slides">
<section>
<h2>Barebones Presentation</h2>
<p>This example contains the bare minimum includes and markup required to run a reveal.js presentation.</p>
</section>
<section>
<h2>No Theme</h2>
<p>There's no theme included, so it will fall back on browser defaults.</p>
</section>
</div>
</div>
<script src="../../js/reveal.js"></script>
<script>
Reveal.initialize();
</script>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More