├── .gitignore
├── favicon.ico
├── sass-watch.bat
├── icons
├── apple-icon.png
├── favicon-16x16.png
├── favicon-32x32.png
├── favicon-96x96.png
├── ms-icon-70x70.png
├── apple-icon-57x57.png
├── apple-icon-60x60.png
├── apple-icon-72x72.png
├── apple-icon-76x76.png
├── ms-icon-144x144.png
├── ms-icon-150x150.png
├── ms-icon-310x310.png
├── android-icon-36x36.png
├── android-icon-48x48.png
├── android-icon-72x72.png
├── android-icon-96x96.png
├── apple-icon-114x114.png
├── apple-icon-120x120.png
├── apple-icon-144x144.png
├── apple-icon-152x152.png
├── apple-icon-180x180.png
├── android-icon-144x144.png
├── android-icon-192x192.png
└── apple-icon-precomposed.png
├── data
├── textures
│ ├── grass.png
│ ├── moss.png
│ ├── checker.png
│ ├── fur-cow.png
│ ├── fur-leo.png
│ ├── fur-wolf.png
│ ├── even-alpha.png
│ ├── fur-chick.png
│ ├── moss-alpha.png
│ ├── bg-gradient.png
│ └── uneven-alpha.png
└── models
│ ├── box10_rounded-indices.bin
│ └── box10_rounded-strides.bin
├── styles
├── scss
│ ├── _common.scss
│ └── site.scss
└── css
│ ├── site.css.map
│ ├── site.css
│ └── theme.min.css
├── .editorconfig
├── js
├── app.js
├── app
│ ├── framework
│ │ ├── BinaryDataLoader.js
│ │ ├── UncompressedTextureLoader.js
│ │ ├── CompressedTextureLoader.js
│ │ ├── FullModel.js
│ │ ├── BaseShader.js
│ │ ├── utils
│ │ │ └── FullscreenUtils.js
│ │ └── BaseRenderer.js
│ ├── VignetteData.js
│ ├── DiffuseColoredShader.js
│ ├── DiffuseShader.js
│ ├── FurPresets.js
│ ├── main.js
│ ├── FurShader.js
│ └── FurRenderer.js
└── lib
│ └── require.js
├── browserconfig.xml
├── manifest.json
├── LICENSE.txt
├── README.md
└── index.html
/.gitignore:
--------------------------------------------------------------------------------
1 | /.sass-cache
2 | /node_modules
3 | /temp
4 |
--------------------------------------------------------------------------------
/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/favicon.ico
--------------------------------------------------------------------------------
/sass-watch.bat:
--------------------------------------------------------------------------------
1 | sass --watch styles\scss\site.scss:styles\css\site.css --style compressed
2 |
--------------------------------------------------------------------------------
/icons/apple-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon.png
--------------------------------------------------------------------------------
/data/textures/grass.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/grass.png
--------------------------------------------------------------------------------
/data/textures/moss.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/moss.png
--------------------------------------------------------------------------------
/icons/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/favicon-16x16.png
--------------------------------------------------------------------------------
/icons/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/favicon-32x32.png
--------------------------------------------------------------------------------
/icons/favicon-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/favicon-96x96.png
--------------------------------------------------------------------------------
/icons/ms-icon-70x70.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/ms-icon-70x70.png
--------------------------------------------------------------------------------
/data/textures/checker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/checker.png
--------------------------------------------------------------------------------
/data/textures/fur-cow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/fur-cow.png
--------------------------------------------------------------------------------
/data/textures/fur-leo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/fur-leo.png
--------------------------------------------------------------------------------
/data/textures/fur-wolf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/fur-wolf.png
--------------------------------------------------------------------------------
/icons/apple-icon-57x57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-57x57.png
--------------------------------------------------------------------------------
/icons/apple-icon-60x60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-60x60.png
--------------------------------------------------------------------------------
/icons/apple-icon-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-72x72.png
--------------------------------------------------------------------------------
/icons/apple-icon-76x76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-76x76.png
--------------------------------------------------------------------------------
/icons/ms-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/ms-icon-144x144.png
--------------------------------------------------------------------------------
/icons/ms-icon-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/ms-icon-150x150.png
--------------------------------------------------------------------------------
/icons/ms-icon-310x310.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/ms-icon-310x310.png
--------------------------------------------------------------------------------
/styles/scss/_common.scss:
--------------------------------------------------------------------------------
1 | $screen-sm-min: 768px;
2 | $screen-md-min: 992px;
3 | $screen-lg-min: 1200px;
4 |
--------------------------------------------------------------------------------
/data/textures/even-alpha.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/even-alpha.png
--------------------------------------------------------------------------------
/data/textures/fur-chick.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/fur-chick.png
--------------------------------------------------------------------------------
/data/textures/moss-alpha.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/moss-alpha.png
--------------------------------------------------------------------------------
/icons/android-icon-36x36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/android-icon-36x36.png
--------------------------------------------------------------------------------
/icons/android-icon-48x48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/android-icon-48x48.png
--------------------------------------------------------------------------------
/icons/android-icon-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/android-icon-72x72.png
--------------------------------------------------------------------------------
/icons/android-icon-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/android-icon-96x96.png
--------------------------------------------------------------------------------
/icons/apple-icon-114x114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-114x114.png
--------------------------------------------------------------------------------
/icons/apple-icon-120x120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-120x120.png
--------------------------------------------------------------------------------
/icons/apple-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-144x144.png
--------------------------------------------------------------------------------
/icons/apple-icon-152x152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-152x152.png
--------------------------------------------------------------------------------
/icons/apple-icon-180x180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-180x180.png
--------------------------------------------------------------------------------
/data/textures/bg-gradient.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/bg-gradient.png
--------------------------------------------------------------------------------
/data/textures/uneven-alpha.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/uneven-alpha.png
--------------------------------------------------------------------------------
/icons/android-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/android-icon-144x144.png
--------------------------------------------------------------------------------
/icons/android-icon-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/android-icon-192x192.png
--------------------------------------------------------------------------------
/icons/apple-icon-precomposed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-precomposed.png
--------------------------------------------------------------------------------
/data/models/box10_rounded-indices.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/models/box10_rounded-indices.bin
--------------------------------------------------------------------------------
/data/models/box10_rounded-strides.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/models/box10_rounded-strides.bin
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | [*.html]
2 | indent_style = space
3 | indent_size = 4
4 |
5 | [*.css]
6 | indent_style = space
7 | indent_size = 4
8 |
9 | [*.scss]
10 | indent_style = space
11 | indent_size = 4
12 |
13 | [*.js]
14 | indent_style = space
15 | indent_size = 4
16 |
--------------------------------------------------------------------------------
/js/app.js:
--------------------------------------------------------------------------------
1 | requirejs.config({
2 | 'baseUrl': 'js/app',
3 | 'paths': {
4 | 'app': '../app',
5 | 'jquery': 'https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min',
6 | 'bootstrap-slider': 'https://cdnjs.cloudflare.com/ajax/libs/bootstrap-slider/9.7.2/bootstrap-slider.min'
7 | }
8 | });
9 |
10 | requirejs(['app/main']);
11 |
--------------------------------------------------------------------------------
/browserconfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | #ffffff
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/js/app/framework/BinaryDataLoader.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | define(function() {
4 |
5 | function BinaryDataLoader() {}
6 |
7 | /**
8 | * Static function to load binary data
9 | * @param {string} url - URL for content
10 | * @param {Function} - callback to receive binary data
11 | */
12 | BinaryDataLoader.load = function(url, callback) {
13 | var root = this,
14 | xhr = new XMLHttpRequest();
15 |
16 | xhr.open('GET', url, true);
17 | xhr.responseType = 'arraybuffer';
18 | xhr.onload = function() {
19 | callback && callback(this.response);
20 | };
21 | xhr.send(null);
22 | }
23 |
24 | return BinaryDataLoader;
25 | });
26 |
--------------------------------------------------------------------------------
/js/app/VignetteData.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | define(function() {
4 |
5 | /**
6 | * Helper class to render billboard taking whole screen.
7 | * @class
8 | */
9 | function VignetteData() {
10 | this.quadTriangles = [
11 | // X, Y, Z, U, V
12 | -1.0, -1.0, -5.0, 0.0, 0.0, // 0. left-bottom
13 | 1.0, -1.0, -5.0, 1.0, 0.0, // 1. right-bottom
14 | -1.0, 1.0, -5.0, 0.0, 1.0, // 2. left-top
15 | 1.0, 1.0, -5.0, 1.0, 1.0 // 3. right-top
16 | ];
17 | }
18 |
19 | VignetteData.prototype = {
20 | buffer: null,
21 |
22 | initGL: function(gl) {
23 | this.buffer = gl.createBuffer();
24 | gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);
25 | gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(this.quadTriangles), gl.STATIC_DRAW);
26 | }
27 | }
28 |
29 | return VignetteData;
30 | });
31 |
--------------------------------------------------------------------------------
/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "App",
3 | "icons": [
4 | {
5 | "src": "\/icons\/android-icon-36x36.png",
6 | "sizes": "36x36",
7 | "type": "image\/png",
8 | "density": "0.75"
9 | },
10 | {
11 | "src": "\/icons\/android-icon-48x48.png",
12 | "sizes": "48x48",
13 | "type": "image\/png",
14 | "density": "1.0"
15 | },
16 | {
17 | "src": "\/icons\/android-icon-72x72.png",
18 | "sizes": "72x72",
19 | "type": "image\/png",
20 | "density": "1.5"
21 | },
22 | {
23 | "src": "\/icons\/android-icon-96x96.png",
24 | "sizes": "96x96",
25 | "type": "image\/png",
26 | "density": "2.0"
27 | },
28 | {
29 | "src": "\/icons\/android-icon-144x144.png",
30 | "sizes": "144x144",
31 | "type": "image\/png",
32 | "density": "3.0"
33 | },
34 | {
35 | "src": "\/icons\/android-icon-192x192.png",
36 | "sizes": "192x192",
37 | "type": "image\/png",
38 | "density": "4.0"
39 | }
40 | ]
41 | }
42 |
--------------------------------------------------------------------------------
/js/app/DiffuseColoredShader.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | define(['DiffuseShader'], function(DiffuseShader) {
4 |
5 | /**
6 | * Simple diffuse texture multiplied by color shader.
7 | * @class
8 | */
9 | class DiffuseColoredShader extends DiffuseShader {
10 | fillCode() {
11 | super.fillCode();
12 |
13 | this.fragmentShaderCode = 'precision mediump float;\n' +
14 | 'varying vec2 vTextureCoord;\n' +
15 | 'uniform sampler2D sTexture;\n' +
16 | 'uniform vec4 color;\n' +
17 | '\n' +
18 | 'void main() {\n' +
19 | ' gl_FragColor = texture2D(sTexture, vTextureCoord) * color;\n' +
20 | '}';
21 | }
22 |
23 | fillUniformsAttributes() {
24 | super.fillUniformsAttributes();
25 | this.color = this.getUniform('color');
26 | }
27 | }
28 |
29 | return DiffuseColoredShader;
30 | });
31 |
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | Copyright (c) 2016-2017 Oleksandr Popov, Dmytro Popov
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
4 | files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
5 | modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
6 | is furnished to do so, subject to the following conditions:
7 |
8 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
9 |
10 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
11 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
12 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
13 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
14 |
--------------------------------------------------------------------------------
/js/app/DiffuseShader.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | define(['framework/BaseShader'], function(BaseShader) {
4 |
5 | /**
6 | * Simple diffuse texture shader.
7 | * @class
8 | */
9 | class DiffuseShader extends BaseShader {
10 | fillCode() {
11 | this.vertexShaderCode = 'uniform mat4 view_proj_matrix;\n' +
12 | 'attribute vec4 rm_Vertex;\n' +
13 | 'attribute vec2 rm_TexCoord0;\n' +
14 | 'varying vec2 vTextureCoord;\n' +
15 | '\n' +
16 | 'void main() {\n' +
17 | ' gl_Position = view_proj_matrix * rm_Vertex;\n' +
18 | ' vTextureCoord = rm_TexCoord0;\n' +
19 | '}';
20 |
21 | this.fragmentShaderCode = 'precision mediump float;\n' +
22 | 'varying vec2 vTextureCoord;\n' +
23 | 'uniform sampler2D sTexture;\n' +
24 | '\n' +
25 | 'void main() {\n' +
26 | ' gl_FragColor = texture2D(sTexture, vTextureCoord);\n' +
27 | '}';
28 | }
29 |
30 | fillUniformsAttributes() {
31 | this.view_proj_matrix = this.getUniform('view_proj_matrix');
32 | this.rm_Vertex = this.getAttrib('rm_Vertex');
33 | this.rm_TexCoord0 = this.getAttrib('rm_TexCoord0');
34 | this.sTexture = this.getUniform('sTexture');
35 | }
36 | }
37 |
38 | return DiffuseShader;
39 | });
40 |
--------------------------------------------------------------------------------
/js/app/framework/UncompressedTextureLoader.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | define(function() {
4 |
5 | /**
6 | * Constructor. No need to create an instance of this class because it has only static methods
7 | */
8 | function UncompressedTextureLoader() {}
9 |
10 | /**
11 | * Loads texture from any image format supported by browser
12 | * @param {string} url - URL to texture
13 | * @param {Function} callbak - callback called after texture is loaded to GPU
14 | * @return {number} - WebGL texture
15 | */
16 | UncompressedTextureLoader.load = function(url, callback) {
17 | var texture = gl.createTexture();
18 |
19 | texture.image = new Image();
20 | texture.image.src = url;
21 | texture.image.onload = function() {
22 | gl.bindTexture(gl.TEXTURE_2D, texture);
23 | gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.image);
24 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
25 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
26 | gl.bindTexture(gl.TEXTURE_2D, null);
27 |
28 | if (texture.image && texture.image.src) {
29 | console.log('Loaded texture ' + url + ' [' + texture.image.width + 'x' + texture.image.height + ']');
30 | }
31 |
32 | callback && callback();
33 | };
34 |
35 | return texture;
36 | }
37 |
38 | return UncompressedTextureLoader;
39 | });
40 |
--------------------------------------------------------------------------------
/styles/css/site.css.map:
--------------------------------------------------------------------------------
1 | {
2 | "version": 3,
3 | "mappings": "AAEA,IAAK,CACD,gBAAgB,CAAE,IAAI,CAG1B,SAAU,CACN,OAAO,CAAE,KAAK,CACd,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,KAAK,CACb,aAAa,CAAE,GAAG,CAClB,aAAa,CAAE,IAAI,CACnB,MAAM,CAAE,sBAAsB,CAE9B,aAAM,CACF,aAAa,CAAE,CAAC,CAChB,MAAM,CAAE,IAAI,CACZ,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,KAAK,CACd,GAAG,CAAE,CAAC,CACN,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,KAAK,CAIrB,SAAU,CACN,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,CAAC,CACN,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,CAAC,CACR,MAAM,CAAE,IAAI,CACZ,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,IAAI,CACjB,OAAO,CAAE,IAAI,CAEb,yBAAkC,CAVtC,SAAU,CAWF,WAAW,CAAE,IAAI,CACjB,YAAY,CAAE,IAAI,EAGtB,aAAM,CACF,OAAO,CAAE,CAAC,CACV,WAAW,CAAE,IAAI,CAEjB,yBAAkC,CAJtC,aAAM,CAKE,WAAW,CAAE,CAAC,CACd,YAAY,CAAE,IAAI,EAI1B,wBAAe,CACX,KAAK,CAAE,IAAI,CACX,WAAW,CAAE,mBAAwB,CACrC,WAAW,CAAE,CAAC,CAGlB,iBAAQ,CACJ,SAAS,CAAE,IAAI,CAIvB,aAAc,CACV,QAAQ,CAAE,QAAQ,CAElB,6BAAgB,CACZ,KAAK,CAAE,IAAI,CACX,WAAW,CAAE,mBAAwB,CAGzC,wBAAa,CACT,KAAK,CAAE,IAAI,CACX,GAAG,CAAE,IAAI,CAET,uCAAe,CACX,OAAO,CAAE,YAAY,CAGzB,sCAAc,CACV,OAAO,CAAE,IAAI,CAGjB,4BAAM,CACF,KAAK,CAAE,IAAI,CACX,GAAG,CAAE,IAAI,CAET,2CAAe,CACX,OAAO,CAAE,IAAI,CAGjB,0CAAc,CACV,OAAO,CAAE,YAAY,CAKjC,8BAAmB,CACf,IAAI,CAAE,IAAI,CACV,GAAG,CAAE,IAAI,CAET,kDAAoB,CAChB,OAAO,CAAE,YAAY,CAGzB,kDAAoB,CAChB,OAAO,CAAE,IAAI,CAGjB,kCAAM,CACF,IAAI,CAAE,IAAI,CACV,GAAG,CAAE,IAAI,CAIT,uDAAoB,CAChB,OAAO,CAAE,IAAI,CAGjB,uDAAoB,CAChB,OAAO,CAAE,YAAY,CAKjC,8BAAmB,CACf,IAAI,CAAE,IAAI,CACV,GAAG,CAAE,GAAG,CAGZ,0BAAe,CACX,KAAK,CAAE,IAAI,CACX,GAAG,CAAE,GAAG,CAKZ,qBAAQ,CACJ,SAAS,CAAE,IAAI,CAEnB,qBAAQ,CACJ,SAAS,CAAE,IAAI,CAEnB,qBAAQ,CACJ,SAAS,CAAE,IAAI,CAEnB,qBAAQ,CACJ,SAAS,CAAE,IAAI",
4 | "sources": ["../scss/site.scss"],
5 | "names": [],
6 | "file": "site.css"
7 | }
--------------------------------------------------------------------------------
/styles/css/site.css:
--------------------------------------------------------------------------------
1 | body{background-color:#ccc}.canvasGL{display:block;width:100vw;height:100vh;border-radius:7px;border-radius:30px;border:20px solid transparent}.fs .canvasGL{border-radius:0;border:none;position:absolute;display:block;top:0;left:0;width:100vw;height:100vh}.controls{position:absolute;top:0;left:0;right:0;margin:20px;padding:20px;padding-top:60px;opacity:0.88}@media (min-width: 768px){.controls{padding-top:20px;padding-left:50px}}.fs .controls{padding:0;padding-top:60px}@media (min-width: 768px){.fs .controls{padding-top:0;padding-left:30px}}.controls .control-label{color:#fff;text-shadow:#030303 0px 0px 8px;padding-top:0}.controls .slider{min-width:100%}.control-icon{position:absolute}.control-icon .material-icons{color:#fff;text-shadow:#030303 0px 0px 8px}.control-icon.control-fs{right:40px;top:40px}.control-icon.control-fs .icon-enter-fs{display:inline-block}.control-icon.control-fs .icon-exit-fs{display:none}.fs .control-icon.control-fs{right:20px;top:20px}.fs .control-icon.control-fs .icon-enter-fs{display:none}.fs .control-icon.control-fs .icon-exit-fs{display:inline-block}.control-icon.control-settings{left:40px;top:40px}.control-icon.control-settings .icon-show-settings{display:inline-block}.control-icon.control-settings .icon-hide-settings{display:none}.fs .control-icon.control-settings{left:20px;top:20px}.control-icon.control-settings.open .icon-show-settings{display:none}.control-icon.control-settings.open .icon-hide-settings{display:inline-block}.control-icon.control-previous{left:40px;top:50%}.control-icon.control-next{right:40px;top:50%}.material-icons.md-18{font-size:18px}.material-icons.md-24{font-size:24px}.material-icons.md-36{font-size:36px}.material-icons.md-48{font-size:48px}
2 | /*# sourceMappingURL=site.css.map */
3 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # WebGL 2 Fur demo
2 |
3 | Fur/grass WebGL 2 demo. Implemented using instanced rendering.
4 |
5 | Works in latest Chrome and Firefox.
6 | Live demo is here - https://keaukraine.github.io/webgl-fur/
7 |
8 | ## Used Libraries
9 |
10 | * Twitter Bootstrap used under the MIT License https://github.com/twbs/bootstrap/blob/master/LICENSE
11 | * Material Icons by Google used under Apache License https://design.google.com/icons/
12 | * bootstrap-slider by Kyle Kemp, Rohit Kalkur, and contributors used under MIT License https://github.com/seiyria/bootstrap-slider
13 | * RequireJS, Released under the MIT license https://github.com/requirejs/requirejs/blob/master/LICENSE
14 | * jQuery used under the MIT license https://jquery.org/license/
15 | * gl-matrix, a high performance matrix and vector operations by Brandon Jones and Colin MacKenzie IV
16 | * WebGL initialization code is based on http://learningwebgl.com/ tutorials
17 | * Basic low-level WebGL framework - https://github.com/keaukraine/webgl-framework
18 |
19 | ## License
20 |
21 | **The MIT License**
22 |
23 | Copyright (c) 2016-2017 Oleksandr Popov, Dmytro Popov
24 |
25 | 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:
26 |
27 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
28 |
29 | 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.
30 |
--------------------------------------------------------------------------------
/js/app/FurPresets.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | define(function() {
4 |
5 | function FurPresets() {}
6 |
7 | FurPresets.presets = [{
8 | 'name': 'Leopard',
9 | 'layers': 20,
10 | 'thickness': 0.15,
11 | 'waveScale': 0.5,
12 | 'diffuseTexture': 'fur-leo.png',
13 | 'alphaTexture': 'uneven-alpha.png',
14 | 'startColor': [0.6, 0.6, 0.6, 1.0],
15 | 'endColor': [1.0, 1.0, 1.0, 0.0]
16 | }, {
17 | 'name': 'Cow',
18 | 'layers': 10,
19 | 'thickness': 0.15,
20 | 'waveScale': 0.2,
21 | 'diffuseTexture': 'fur-cow.png',
22 | 'alphaTexture': 'uneven-alpha.png',
23 | 'startColor': [0.7, 0.7, 0.7, 1.0],
24 | 'endColor': [1.0, 1.0, 1.0, 0.0]
25 | }, {
26 | 'name': 'Chick',
27 | 'layers': 13,
28 | 'thickness': 0.13,
29 | 'waveScale': 0.12,
30 | 'diffuseTexture': 'fur-chick.png',
31 | 'alphaTexture': 'even-alpha.png',
32 | 'startColor': [1.15, 1.15, 1.15, 1.0],
33 | 'endColor': [0.95, 0.95, 0.95, 0.2]
34 | }, {
35 | 'name': 'Timber Wolf',
36 | 'layers': 20,
37 | 'thickness': 0.15,
38 | 'waveScale': 0.3,
39 | 'diffuseTexture': 'fur-wolf.png',
40 | 'alphaTexture': 'uneven-alpha.png',
41 | 'startColor': [0.0, 0.0, 0.0, 1.0],
42 | 'endColor': [1.0, 1.0, 1.0, 0.0]
43 | }, {
44 | 'name': 'Moss',
45 | 'layers': 7,
46 | 'thickness': 0.13,
47 | 'waveScale': 0.0,
48 | 'diffuseTexture': 'moss.png',
49 | 'alphaTexture': 'moss-alpha.png',
50 | 'startColor': [0.2, 0.2, 0.2, 1.0],
51 | 'endColor': [1.0, 1.0, 1.0, 0.8]
52 | }];
53 |
54 | FurPresets._current = 0;
55 |
56 | FurPresets.current = function() {
57 | return this.presets[this._current];
58 | };
59 |
60 | FurPresets.next = function() {
61 | this._current++;
62 | if (this._current >= this.presets.length) {
63 | this._current = 0;
64 | }
65 |
66 | return this.presets[this._current];
67 | };
68 |
69 | FurPresets.previous = function() {
70 | this._current--;
71 | if (this._current < 0) {
72 | this._current = this.presets.length - 1;
73 | }
74 |
75 | return this.presets[this._current];
76 | };
77 |
78 | return FurPresets;
79 | });
80 |
--------------------------------------------------------------------------------
/js/app/framework/CompressedTextureLoader.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | define(['./BinaryDataLoader'], function(BinaryDataLoader) {
4 |
5 | /**
6 | * Constructor. No need to create an instance of this class because it has only static methods
7 | */
8 | function CompressedTextureLoader() {}
9 |
10 | /**
11 | * Loads ETC1 texture from PKM format
12 | * @param {string} url - URL to texture in PKM format
13 | * @param {Function} callbak - callback called after texture is loaded to GPU
14 | * @return {number} - WebGL texture
15 | */
16 | CompressedTextureLoader.loadETC1 = function(url, callback) {
17 | var root = this,
18 | texture = gl.createTexture();
19 |
20 | var PKM_HEADER_SIZE = 16; // size of PKM header
21 | var PKM_HEADER_WIDTH_OFFSET = 8; // offset to texture width
22 | var PKM_HEADER_HEIGHT_OFFSET = 10; // offset to texture height
23 |
24 | BinaryDataLoader.load(url, function(data) {
25 | var bufWidth, bufHeight, bufData,
26 | width, height;
27 |
28 | var ETC1_RGB8_OES = 36196;
29 |
30 | if (data.byteLength > 0) {
31 | // Endianness depends on machine architecture, can't read Int16
32 | // In PKM, width and height are big-endian, and x86 is little-endian and ARM is bi-endian
33 | bufWidth = new Uint8Array(data, PKM_HEADER_WIDTH_OFFSET, 2);
34 | width = bufWidth[0]*256 + bufWidth[1];
35 | bufHeight = new Uint8Array(data, PKM_HEADER_HEIGHT_OFFSET, 2);
36 | height = bufHeight[0]*256 + bufHeight[1];
37 | bufData = new Uint8Array(data, PKM_HEADER_SIZE, data.byteLength - PKM_HEADER_SIZE);
38 |
39 | gl.bindTexture(gl.TEXTURE_2D, texture);
40 | gl.compressedTexImage2D(gl.TEXTURE_2D, 0, ETC1_RGB8_OES, width, height, 0, bufData);
41 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
42 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
43 | gl.bindTexture(gl.TEXTURE_2D, null);
44 |
45 | console.log('Loaded texture ' + url + ' [' + width + 'x' + height + ']');
46 |
47 | callback && callback();
48 | }
49 | });
50 |
51 | return texture;
52 | }
53 |
54 | return CompressedTextureLoader;
55 | });
56 |
--------------------------------------------------------------------------------
/js/app/framework/FullModel.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | define(['./BinaryDataLoader'], function(BinaryDataLoader) {
4 |
5 | /**
6 | * Class to represent mesh data
7 | * @class
8 | */
9 | function FullModel() {
10 | this.bufferIndices = null;
11 | this.bufferStrides = null;
12 | this.numIndices = 0;
13 | }
14 |
15 | FullModel.prototype = {
16 |
17 | /**
18 | * Loads binary data for mesh
19 | * @param {string} url - URL for mesh files without trailing "-*.bin"
20 | * @param {Function} callback when data is loaded
21 | */
22 | load: function(url, callback) {
23 | var root = this;
24 |
25 | function loadBuffer(buffer, target, arrayBuffer) {
26 | var byteArray = new Uint8Array(arrayBuffer, 0, arrayBuffer.byteLength);
27 | gl.bindBuffer(target, buffer);
28 | gl.bufferData(target, byteArray, gl.STATIC_DRAW);
29 | }
30 |
31 | BinaryDataLoader.load(url + '-indices.bin',
32 | function(data) {
33 | root.bufferIndices = gl.createBuffer();
34 | console.log('Loaded ' + url + '-indices.bin: ' + data.byteLength + ' bytes');
35 | loadBuffer(root.bufferIndices, gl.ELEMENT_ARRAY_BUFFER, data);
36 | root.numIndices = data.byteLength / 2 / 3;
37 | root.bufferIndices && root.bufferStrides && callback();
38 | }
39 | );
40 | BinaryDataLoader.load(url + '-strides.bin',
41 | function(data) {
42 | root.bufferStrides = gl.createBuffer();
43 | console.log('Loaded ' + url + '-strides.bin: ' + data.byteLength + ' bytes');
44 | loadBuffer(root.bufferStrides, gl.ARRAY_BUFFER, data);
45 | root.bufferIndices && root.bufferStrides && callback();
46 | }
47 | );
48 | },
49 |
50 | /**
51 | * Binds buffers for glDrawElements() call
52 | */
53 | bindBuffers: function() {
54 | gl.bindBuffer(gl.ARRAY_BUFFER, this.bufferStrides);
55 | gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufferIndices);
56 | },
57 |
58 | /**
59 | * Returns number of inices in model
60 | * @return {number} - number of indices
61 | */
62 | getNumIndices: function() {
63 | return this.numIndices;
64 | }
65 | }
66 |
67 | return FullModel;
68 | });
69 |
--------------------------------------------------------------------------------
/styles/scss/site.scss:
--------------------------------------------------------------------------------
1 | @import "common";
2 |
3 | body {
4 | background-color: #ccc;
5 | }
6 |
7 | .canvasGL {
8 | display: block;
9 | width: 100vw;
10 | height: 100vh;
11 | border-radius: 7px;
12 | border-radius: 30px;
13 | border: 20px solid transparent;
14 |
15 | .fs & {
16 | border-radius: 0;
17 | border: none;
18 | position: absolute;
19 | display: block;
20 | top: 0;
21 | left: 0;
22 | width: 100vw;
23 | height: 100vh;
24 | }
25 | }
26 |
27 | .controls {
28 | position: absolute;
29 | top: 0;
30 | left: 0;
31 | right: 0;
32 | margin: 20px;
33 | padding: 20px;
34 | padding-top: 60px;
35 | opacity: 0.88;
36 |
37 | @media(min-width: $screen-sm-min) {
38 | padding-top: 20px;
39 | padding-left: 50px;
40 | }
41 |
42 | .fs & {
43 | padding: 0;
44 | padding-top: 60px;
45 |
46 | @media(min-width: $screen-sm-min) {
47 | padding-top: 0;
48 | padding-left: 30px;
49 | }
50 | }
51 |
52 | .control-label {
53 | color: #fff;
54 | text-shadow: rgb(3, 3, 3) 0px 0px 8px;
55 | padding-top: 0;
56 | }
57 |
58 | .slider {
59 | min-width: 100%;
60 | }
61 | }
62 |
63 | .control-icon {
64 | position: absolute;
65 |
66 | .material-icons {
67 | color: #fff;
68 | text-shadow: rgb(3, 3, 3) 0px 0px 8px;
69 | }
70 |
71 | &.control-fs {
72 | right: 40px;
73 | top: 40px;
74 |
75 | .icon-enter-fs {
76 | display: inline-block;
77 | }
78 |
79 | .icon-exit-fs {
80 | display: none;
81 | }
82 |
83 | .fs & {
84 | right: 20px;
85 | top: 20px;
86 |
87 | .icon-enter-fs {
88 | display: none;
89 | }
90 |
91 | .icon-exit-fs {
92 | display: inline-block;
93 | }
94 | }
95 | }
96 |
97 | &.control-settings {
98 | left: 40px;
99 | top: 40px;
100 |
101 | .icon-show-settings {
102 | display: inline-block;
103 | }
104 |
105 | .icon-hide-settings {
106 | display: none;
107 | }
108 |
109 | .fs & {
110 | left: 20px;
111 | top: 20px;
112 | }
113 |
114 | &.open {
115 | .icon-show-settings {
116 | display: none;
117 | }
118 |
119 | .icon-hide-settings {
120 | display: inline-block;
121 | }
122 | }
123 | }
124 |
125 | &.control-previous {
126 | left: 40px;
127 | top: 50%;
128 | }
129 |
130 | &.control-next {
131 | right: 40px;
132 | top: 50%;
133 | }
134 | }
135 |
136 | .material-icons {
137 | &.md-18 {
138 | font-size: 18px;
139 | }
140 | &.md-24 {
141 | font-size: 24px;
142 | }
143 | &.md-36 {
144 | font-size: 36px;
145 | }
146 | &.md-48 {
147 | font-size: 48px;
148 | }
149 | }
150 |
--------------------------------------------------------------------------------
/js/app/framework/BaseShader.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | define(function() {
4 |
5 | class BaseShader {
6 |
7 | /**
8 | * Constructor. Compiles shader.
9 | */
10 | constructor() {
11 | this.vertexShaderCode = '';
12 | this.fragmentShaderCode = '';
13 | this.program = null;
14 |
15 | this.fillCode();
16 | this.initShader();
17 | }
18 |
19 | /**
20 | * Used to fill shader code. Put actual shader code to this.vertexShaderCode and this.fragmentShaderCode
21 | */
22 | fillCode() {}
23 |
24 | getShader(gl, type, code) {
25 | var shader = gl.createShader(type);
26 |
27 | gl.shaderSource(shader, code);
28 | gl.compileShader(shader);
29 |
30 | if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
31 | console.warn(gl.getShaderInfoLog(shader));
32 | return null;
33 | }
34 |
35 | return shader;
36 | }
37 |
38 | /**
39 | * Retrieve and save uniforms and attributes for actual shader here
40 | */
41 | fillUniformsAttributes() {}
42 |
43 | /**
44 | * Get shader unform location
45 | * @param {string} uniform - uniform name
46 | * @return {number} - uniform location
47 | */
48 | getUniform(uniform) {
49 | return gl.getUniformLocation(this.program, uniform);
50 | }
51 |
52 | /**
53 | * Get shader attribute location
54 | * @param {string} attrib - uniform name
55 | * @return {number} - attribute location
56 | */
57 | getAttrib(attrib) {
58 | return gl.getAttribLocation(this.program, attrib);
59 | }
60 |
61 | /**
62 | * Initializes shader. No need to call this manually, this is called in constructor.
63 | */
64 | initShader() {
65 | var shaderProgram,
66 | fragmentShader = this.getShader(gl, gl.FRAGMENT_SHADER, this.fragmentShaderCode),
67 | vertexShader = this.getShader(gl, gl.VERTEX_SHADER, this.vertexShaderCode);
68 |
69 | shaderProgram = gl.createProgram();
70 | gl.attachShader(shaderProgram, vertexShader);
71 | gl.attachShader(shaderProgram, fragmentShader);
72 | gl.linkProgram(shaderProgram);
73 |
74 | if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
75 | console.warn(this.constructor.name + ': Could not initialise shader');
76 | } else {
77 | console.log(this.constructor.name + ': Initialised shader');
78 | }
79 |
80 | gl.useProgram(shaderProgram);
81 | this.program = shaderProgram;
82 |
83 | this.fillUniformsAttributes();
84 | }
85 |
86 | /**
87 | * Activates shader.
88 | */
89 | use() {
90 | if (this.program) {
91 | gl.useProgram(this.program);
92 | }
93 | }
94 |
95 | /**
96 | * Deletes shader.
97 | */
98 | deleteProgram() {
99 | gl.deleteProgram(this.program);
100 | }
101 | };
102 |
103 | return BaseShader;
104 | });
105 |
--------------------------------------------------------------------------------
/js/app/framework/utils/FullscreenUtils.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @fileOverview Cross-browser full-screen utilities
3 | * @author Oleksandr Popov
4 | */
5 |
6 | 'use strict';
7 |
8 | define(function() {
9 |
10 | function FullScreenUtils() {}
11 |
12 | /**
13 | * Enters fullscreen
14 | */
15 | FullScreenUtils.enterFullScreen = function() {
16 | if (document.documentElement.requestFullscreen) {
17 | if (!document.fullscreenElement) {
18 | document.documentElement.requestFullscreen();
19 | }
20 | }
21 | if (document.documentElement.webkitRequestFullScreen) {
22 | if (!document.webkitFullscreenElement) {
23 | document.documentElement.webkitRequestFullscreen();
24 | }
25 | }
26 | if (document.documentElement.mozRequestFullScreen) {
27 | if (!document.mozFullscreenElement) {
28 | document.documentElement.mozRequestFullScreen();
29 | }
30 | }
31 | }
32 |
33 | /**
34 | * Exits fullscreen
35 | */
36 | FullScreenUtils.exitFullScreen = function() {
37 | if (document.documentElement.requestFullscreen) {
38 | if (document.exitFullscreen) {
39 | document.exitFullscreen();
40 | }
41 | }
42 | if (document.documentElement.webkitRequestFullscreen) {
43 | if (document.webkitExitFullscreen) {
44 | document.webkitExitFullscreen();
45 | }
46 | }
47 | if (document.documentElement.mozRequestFullScreen) {
48 | if (document.mozCancelFullScreen) {
49 | document.mozCancelFullScreen();
50 | }
51 | }
52 | }
53 |
54 | /**
55 | * Adds cross-browser fullscreenchange event
56 | * @param {function} exitHandler - function to be called on fullscreenchange event
57 | */
58 | FullScreenUtils.addFullScreenListener = function(exitHandler) {
59 | if (document.documentElement.requestFullscreen) {
60 | document.addEventListener('fullscreenchange', exitHandler, false);
61 | }
62 | if (document.documentElement.webkitRequestFullScreen) {
63 | document.addEventListener('webkitfullscreenchange', exitHandler, false);
64 | }
65 | if (document.documentElement.mozRequestFullScreen) {
66 | document.addEventListener('mozfullscreenchange', exitHandler, false);
67 | }
68 | }
69 |
70 | /**
71 | * Checks fullscreen state
72 | * @return {Boolean} - true if fullscreen is active, false if not
73 | */
74 | FullScreenUtils.isFullScreen = function() {
75 | if (document.documentElement.requestFullscreen) {
76 | return !!document.fullscreenElement;
77 | }
78 | if (document.documentElement.webkitRequestFullscreen) {
79 | return !!document.webkitFullscreenElement;
80 | }
81 | if (document.documentElement.mozRequestFullScreen) {
82 | return !!document.mozFullScreenElement;
83 | }
84 | }
85 |
86 | /**
87 | * Checks for full-screen API availability
88 | * @return {Boolean} - true if fullscrees is supported, false if not
89 | */
90 | FullScreenUtils.isFullScreenSupported = function() {
91 | return !!document.documentElement.requestFullscreen || !!document.documentElement.webkitRequestFullScreen || !!document.documentElement.mozRequestFullScreen;
92 | }
93 |
94 | return FullScreenUtils;
95 | });
96 |
--------------------------------------------------------------------------------
/js/app/main.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | define([
4 | 'FurRenderer',
5 | 'jquery',
6 | 'bootstrap-slider',
7 | 'framework/utils/FullscreenUtils'
8 | ],
9 | function(
10 | FurRenderer,
11 | $,
12 | Slider,
13 | FullScreenUtils) {
14 |
15 | var renderer,
16 | timeoutHideName;
17 |
18 | /**
19 | * Initialize renderer
20 | */
21 | function initRenderer() {
22 | var oldYaw = 0;
23 |
24 | window.gl = null;
25 |
26 | if (renderer) {
27 | renderer.resetLoaded();
28 | }
29 |
30 | renderer = new FurRenderer();
31 | renderer.init('canvasGL', true);
32 | }
33 |
34 | function initUI() {
35 | // initialize fullscreen if supported
36 | if (FullScreenUtils.isFullScreenSupported()) {
37 | $('#toggleFullscreen').on('click', function(e) {
38 | var $body = $('body');
39 |
40 | if ($body.hasClass('fs')) {
41 | FullScreenUtils.exitFullScreen();
42 | } else {
43 | FullScreenUtils.enterFullScreen();
44 | }
45 | FullScreenUtils.addFullScreenListener(function() {
46 | if (FullScreenUtils.isFullScreen()) {
47 | $body.addClass('fs');
48 | } else {
49 | $body.removeClass('fs');
50 | }
51 | });
52 | });
53 | } else {
54 | $('#toggleFullscreen').addClass('hidden');
55 | }
56 |
57 | // toggle settings visibility
58 | $('#toggleSettings').on('click', function(e) {
59 | var $this = $(this),
60 | $controls = $('#row-settings, #nextPreset, #previousPreset');
61 |
62 | $this.toggleClass('open');
63 | $controls.toggle();
64 | $('#presetName').hide();
65 | });
66 |
67 | $('#nextPreset').on('click', function(e) {
68 | renderer.chooseNextPreset();
69 | });
70 |
71 | $('#previousPreset').on('click', function(e) {
72 | renderer.choosePreviousPreset();
73 | });
74 |
75 | $('input.slider').slider();
76 |
77 | $('#sliderLayers').on('change', function(e) {
78 | renderer.layers = e.value.newValue;
79 | });
80 | $('#sliderThickness').on('change', function(e) {
81 | renderer.thickness = e.value.newValue;
82 | });
83 |
84 | renderer.onPresetLoaded = function() {
85 | $('#sliderLayers').slider('setValue', renderer.layers);
86 | $('#sliderThickness').slider('setValue', renderer.thickness);
87 |
88 | clearTimeout(timeoutHideName);
89 | $('#presetName')
90 | .show()
91 | .text(renderer.presetName);
92 | timeoutHideName = setTimeout(function() {
93 | $('#presetName').hide();
94 | }, 3000);
95 | };
96 | }
97 |
98 | $(function() {
99 | initRenderer();
100 | initUI();
101 | });
102 | });
103 |
--------------------------------------------------------------------------------
/js/app/FurShader.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | define(['framework/BaseShader'], function(BaseShader) {
4 |
5 | class FurShader extends BaseShader {
6 | fillCode() {
7 | this.vertexShaderCode = '#version 300 es\r\n' +
8 | 'precision highp float;\r\n' +
9 | 'uniform mat4 view_proj_matrix;\r\n' +
10 | 'uniform float layerThickness;\r\n' +
11 | 'uniform float layersCount;\r\n' +
12 | 'uniform vec4 colorStart;\r\n' +
13 | 'uniform vec4 colorEnd;\r\n' +
14 | 'uniform float time;\r\n' +
15 | 'uniform float waveScale;\r\n' +
16 | 'uniform float stiffness;\r\n' +
17 | '\r\n' +
18 | 'in vec4 rm_Vertex;\r\n' +
19 | 'in vec2 rm_TexCoord0;\r\n' +
20 | 'in vec3 rm_Normal;\r\n' +
21 | '\r\n' +
22 | 'out vec2 vTexCoord0;\r\n' +
23 | 'out vec4 vAO;\r\n' +
24 | '\r\n' +
25 | 'const float PI2 = 6.2831852;\r\n' +
26 | 'const float RANDOM_COEFF_1 = 0.1376;\r\n' +
27 | 'const float RANDOM_COEFF_2 = 0.3726;\r\n' +
28 | 'const float RANDOM_COEFF_3 = 0.2546;\r\n' +
29 | '\r\n' +
30 | 'void main( void )\r\n' +
31 | '{\r\n' +
32 | ' float f = float(gl_InstanceID + 1) * layerThickness;\r\n' +
33 | ' float layerCoeff = float(gl_InstanceID) / layersCount;\r\n' +
34 | ' vec4 vertex = rm_Vertex + vec4(rm_Normal, 0.0) * vec4(f, f, f, 0.0);\r\n' +
35 | ' float timePi2 = time * PI2;\r\n' +
36 | ' float waveScaleFinal = waveScale * pow(layerCoeff, stiffness);\r\n' +
37 | '\r\n' +
38 | ' vertex.x += sin(timePi2 + ((rm_Vertex.x+rm_Vertex.y+rm_Vertex.z) * RANDOM_COEFF_1)) * waveScaleFinal;\r\n' +
39 | ' vertex.y += cos(timePi2 + ((rm_Vertex.x-rm_Vertex.y+rm_Vertex.z) * RANDOM_COEFF_2)) * waveScaleFinal;\r\n' +
40 | ' vertex.z += sin(timePi2 + ((rm_Vertex.x+rm_Vertex.y-rm_Vertex.z) * RANDOM_COEFF_3)) * waveScaleFinal;\r\n' +
41 | ' gl_Position = view_proj_matrix * vertex;\r\n' +
42 | ' vTexCoord0 = vec2(rm_TexCoord0);\r\n' +
43 | ' vAO = mix(colorStart, colorEnd, layerCoeff);\r\n' +
44 | '}';
45 |
46 | this.fragmentShaderCode = '#version 300 es\r\n' +
47 | 'precision highp float;\r\n' +
48 | 'uniform sampler2D diffuseMap;\r\n' +
49 | 'uniform sampler2D alphaMap;\r\n' +
50 | 'in vec2 vTexCoord0;\r\n' +
51 | 'in vec4 vAO;\r\n' +
52 | 'out vec4 fragColor;\r\n' +
53 | '\r\n' +
54 | 'void main()\r\n' +
55 | '{\r\n' +
56 | ' vec4 diffuseColor = texture(diffuseMap, vTexCoord0);\r\n' +
57 | ' float alphaColor = texture(alphaMap, vTexCoord0).r;\r\n' +
58 | ' fragColor = diffuseColor * vAO;\r\n' +
59 | ' fragColor.a *= alphaColor;\r\n' +
60 | '}';
61 | }
62 |
63 | fillUniformsAttributes() {
64 | this.view_proj_matrix = this.getUniform('view_proj_matrix');
65 | this.rm_Vertex = this.getAttrib('rm_Vertex');
66 | this.rm_TexCoord0 = this.getAttrib('rm_TexCoord0');
67 | this.rm_Normal = this.getAttrib('rm_Normal');
68 | this.diffuseMap = this.getUniform('diffuseMap');
69 | this.alphaMap = this.getUniform('alphaMap');
70 | this.layerThickness = this.getUniform('layerThickness');
71 | this.layersCount = this.getUniform('layersCount');
72 | this.colorStart = this.getUniform('colorStart');
73 | this.colorEnd = this.getUniform('colorEnd');
74 | this.time = this.getUniform('time');
75 | this.waveScale = this.getUniform('waveScale');
76 | this.stiffness = this.getUniform('stiffness');
77 | }
78 | }
79 |
80 | return FurShader;
81 | });
82 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | Fur WebGL 2 demo
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
41 |
42 |
43 |
44 |
45 |
Loading...
46 |
51 |
52 |
53 |
54 |
55 |
56 | Cannot initialize WebGL 2 context.
57 |
58 |
59 |
60 |
66 |
91 |
92 |
93 |
94 | fullscreen
95 | fullscreen_exit
96 |
97 |
98 | settings
99 | close
100 |
101 |
102 | chevron_right
103 |
104 |
105 | chevron_left
106 |
107 |
108 |
109 |
110 |
--------------------------------------------------------------------------------
/js/app/framework/BaseRenderer.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | define([
4 | './utils/MatrixUtils'
5 | ],
6 | function(MatrixUtils) {
7 |
8 | /**
9 | * Constructor
10 | */
11 | function BaseRenderer() {
12 | this.mMMatrix = MatrixUtils.mat4.create();
13 | this.mVMatrix = MatrixUtils.mat4.create();
14 | this.mMVPMatrix = MatrixUtils.mat4.create();
15 | this.mProjMatrix = MatrixUtils.mat4.create();
16 |
17 | this.matOrtho = MatrixUtils.mat4.create();
18 | MatrixUtils.mat4.ortho(this.matOrtho, -1, 1, -1, 1, 2.0, 250);
19 |
20 | this.boundTick = this.tick.bind(this);
21 | }
22 |
23 | /**
24 | * Logs last GL error to console
25 | */
26 | BaseRenderer.prototype.logGLError = function() {
27 | var err = gl.getError();
28 | if (err !== gl.NO_ERROR) {
29 | console.warn('WebGL error #' + err);
30 | }
31 | }
32 |
33 | /**
34 | * Binds 2D texture.
35 | * @param {number} textureUnit - texture unit to a
36 | * @param {number} textureID - texture to be used
37 | * @param {number} uniformID - shader's uniform ID
38 | */
39 | BaseRenderer.prototype.setTexture2D = function(textureUnit, textureID, uniformID) {
40 | gl.activeTexture(gl.TEXTURE0 + textureUnit);
41 | gl.bindTexture(gl.TEXTURE_2D, textureID);
42 | gl.uniform1i(uniformID, textureUnit);
43 | }
44 |
45 | /**
46 | * Binds cubemap texture.
47 | * @param {number} textureUnit - texture unit to a
48 | * @param {number} textureID - texture to be used
49 | * @param {number} uniformID - shader's uniform ID
50 | */
51 | BaseRenderer.prototype.setTextureCubemap = function(textureUnit, textureID, uniformID) {
52 | gl.ActiveTexture(gl.TEXTURE0 + textureUnit);
53 | gl.BindTexture(gl.TEXTURE_CUBE_MAP, textureID);
54 | gl.Uniform1i(uniformID, textureUnit);
55 | }
56 |
57 | /**
58 | * Calculates FOV for matrix.
59 | * @param {Mat4} matrix - output matrix
60 | * @param {number} fovY - vertical FOV in degrees
61 | * @param {number} aspect - aspect ratio of viewport
62 | * @param {number} zNear - near clipping plane distance
63 | * @param {number} zFar - far clipping plane distance
64 | */
65 | BaseRenderer.prototype.setFOV = function(matrix, fovY, aspect, zNear, zFar) {
66 | var fW, fH;
67 |
68 | fH = Math.tan(fovY / 360.0 * 3.1415926) * zNear;
69 | fW = fH * aspect;
70 | MatrixUtils.mat4.frustum(matrix, -fW, fW, -fH, fH, zNear, zFar);
71 | }
72 |
73 | /**
74 | * Calculates MVP matrix. Saved in this.mMVPMatrix
75 | */
76 | BaseRenderer.prototype.calculateMVPMatrix = function(tx, ty, tz, rx, ry, rz, sx, sy, sz) {
77 | MatrixUtils.mat4.identity(this.mMMatrix);
78 | MatrixUtils.mat4.rotate(this.mMMatrix, this.mMMatrix, 0, [1, 0, 0]);
79 | MatrixUtils.mat4.translate(this.mMMatrix, this.mMMatrix, [tx, ty, tz]);
80 | MatrixUtils.mat4.scale(this.mMMatrix, this.mMMatrix, [sx, sy, sz]);
81 | MatrixUtils.mat4.rotateX(this.mMMatrix, this.mMMatrix, rx);
82 | MatrixUtils.mat4.rotateY(this.mMMatrix, this.mMMatrix, ry);
83 | MatrixUtils.mat4.rotateZ(this.mMMatrix, this.mMMatrix, rz);
84 | MatrixUtils.mat4.multiply(this.mMVPMatrix, this.mVMatrix, this.mMMatrix);
85 | MatrixUtils.mat4.multiply(this.mMVPMatrix, this.mProjMatrix, this.mMVPMatrix);
86 | }
87 |
88 | /**
89 | * Called before WebGL initialization
90 | */
91 | BaseRenderer.prototype.onBeforeInit = function() {}
92 |
93 | /**
94 | * Called right after WebGL initialization
95 | */
96 | BaseRenderer.prototype.onAfterInit = function() {}
97 |
98 | /**
99 | * Called on WebGL initialization error
100 | */
101 | BaseRenderer.prototype.onInitError = function() {}
102 |
103 | /**
104 | * Shaders initialization code goes here
105 | */
106 | BaseRenderer.prototype.initShaders = function() {}
107 |
108 | /**
109 | * Load WebGL data here
110 | */
111 | BaseRenderer.prototype.loadData = function() {}
112 |
113 | /**
114 | * Perform each frame's draw calls here
115 | */
116 | BaseRenderer.prototype.drawScene = function() {
117 | gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
118 | gl.clearColor(0.0, 0.0, 0.0, 1.0);
119 | gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
120 | }
121 |
122 | /**
123 | * Update timers and aminate stuff here
124 | */
125 | BaseRenderer.prototype.animate = function() {}
126 |
127 | /**
128 | * Called on each frame
129 | */
130 | BaseRenderer.prototype.tick = function() {
131 | requestAnimationFrame(this.boundTick);
132 | this.resizeCanvas();
133 | this.drawScene();
134 | this.animate();
135 | }
136 |
137 | /**
138 | * Initializes WebGL context
139 | * @param {HTMLElement} canvas - canvas to initialize WebGL
140 | */
141 | BaseRenderer.prototype.initGL = function(canvas) {
142 | var gl = null;
143 |
144 | try {
145 | gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
146 | gl.viewportWidth = canvas.width;
147 | gl.viewportHeight = canvas.height;
148 | this.isETC1Supported = !!gl.getExtension('WEBGL_compressed_texture_etc1');
149 | } catch (e) {}
150 | if (!gl) {
151 | console.warn('Could not initialise WebGL');
152 | }
153 |
154 | return gl;
155 | };
156 |
157 | /**
158 | * Initializes WebGL 2 context
159 | * @param {HTMLElement} canvas - canvas to initialize WebGL
160 | */
161 | BaseRenderer.prototype.initGL2 = function(canvas) {
162 | var gl = null;
163 |
164 | try {
165 | gl = canvas.getContext('webgl2');
166 | } catch (e) {}
167 | this.isWebGL2 = !!gl;
168 |
169 | if (!this.isWebGL2) {
170 | console.warn('Could not initialise WebGL 2, falling back to WebGL 1');
171 | return this.initGL(canvas);
172 | } else {
173 | return gl;
174 | }
175 | };
176 |
177 | /**
178 | * Initializes WebGL and calls all callbacks. Assigns current WebGL context to global window.gl
179 | * @param {String} canvasID - ID of canvas element to initialize WebGL
180 | */
181 | BaseRenderer.prototype.init = function(canvasID, requestWebGL2) {
182 | this.onBeforeInit();
183 |
184 | this.canvas = document.getElementById(canvasID);
185 | window.gl = !!requestWebGL2 ? this.initGL2(this.canvas) : this.initGL(this.canvas);
186 |
187 | if (window.gl) {
188 | this.onAfterInit();
189 | this.initShaders();
190 | this.loadData();
191 | this.boundTick();
192 | } else {
193 | this.onInitError();
194 | }
195 | }
196 |
197 | /**
198 | * Adjusts viewport according to resizing of canvas
199 | */
200 | BaseRenderer.prototype.resizeCanvas = function() {
201 | var cssToRealPixels = window.devicePixelRatio || 1,
202 | displayWidth = Math.floor(this.canvas.clientWidth * cssToRealPixels),
203 | displayHeight = Math.floor(this.canvas.clientHeight * cssToRealPixels);
204 |
205 | if (this.canvas.width != displayWidth || this.canvas.height != displayHeight) {
206 | this.canvas.width = displayWidth;
207 | this.canvas.height = displayHeight;
208 | }
209 | }
210 |
211 | return BaseRenderer;
212 | });
213 |
--------------------------------------------------------------------------------
/js/lib/require.js:
--------------------------------------------------------------------------------
1 | /** vim: et:ts=4:sw=4:sts=4
2 | * @license RequireJS 2.3.1 Copyright jQuery Foundation and other contributors.
3 | * Released under MIT license, https://github.com/requirejs/requirejs/blob/master/LICENSE
4 | */
5 | var requirejs,require,define;!function(global,setTimeout){function commentReplace(e,t){return t||""}function isFunction(e){return"[object Function]"===ostring.call(e)}function isArray(e){return"[object Array]"===ostring.call(e)}function each(e,t){if(e){var i;for(i=0;i-1&&(!e[i]||!t(e[i],i,e));i-=1);}}function hasProp(e,t){return hasOwn.call(e,t)}function getOwn(e,t){return hasProp(e,t)&&e[t]}function eachProp(e,t){var i;for(i in e)if(hasProp(e,i)&&t(e[i],i))break}function mixin(e,t,i,r){return t&&eachProp(t,function(t,n){!i&&hasProp(e,n)||(!r||"object"!=typeof t||!t||isArray(t)||isFunction(t)||t instanceof RegExp?e[n]=t:(e[n]||(e[n]={}),mixin(e[n],t,i,r)))}),e}function bind(e,t){return function(){return t.apply(e,arguments)}}function scripts(){return document.getElementsByTagName("script")}function defaultOnError(e){throw e}function getGlobal(e){if(!e)return e;var t=global;return each(e.split("."),function(e){t=t[e]}),t}function makeError(e,t,i,r){var n=new Error(t+"\nhttp://requirejs.org/docs/errors.html#"+e);return n.requireType=e,n.requireModules=r,i&&(n.originalError=i),n}function newContext(e){function t(e){var t,i;for(t=0;t0&&(e.splice(t-1,2),t-=2)}}function i(e,i,r){var n,o,a,s,u,c,d,p,f,l,h,m,g=i&&i.split("/"),v=y.map,x=v&&v["*"];if(e&&(e=e.split("/"),d=e.length-1,y.nodeIdCompat&&jsSuffixRegExp.test(e[d])&&(e[d]=e[d].replace(jsSuffixRegExp,"")),"."===e[0].charAt(0)&&g&&(m=g.slice(0,g.length-1),e=m.concat(e)),t(e),e=e.join("/")),r&&v&&(g||x)){a=e.split("/");e:for(s=a.length;s>0;s-=1){if(c=a.slice(0,s).join("/"),g)for(u=g.length;u>0;u-=1)if(o=getOwn(v,g.slice(0,u).join("/")),o&&(o=getOwn(o,c))){p=o,f=s;break e}!l&&x&&getOwn(x,c)&&(l=getOwn(x,c),h=s)}!p&&l&&(p=l,f=h),p&&(a.splice(0,f,p),e=a.join("/"))}return n=getOwn(y.pkgs,e),n?n:e}function r(e){isBrowser&&each(scripts(),function(t){if(t.getAttribute("data-requiremodule")===e&&t.getAttribute("data-requirecontext")===q.contextName)return t.parentNode.removeChild(t),!0})}function n(e){var t=getOwn(y.paths,e);if(t&&isArray(t)&&t.length>1)return t.shift(),q.require.undef(e),q.makeRequire(null,{skipMap:!0})([e]),!0}function o(e){var t,i=e?e.indexOf("!"):-1;return i>-1&&(t=e.substring(0,i),e=e.substring(i+1,e.length)),[t,e]}function a(e,t,r,n){var a,s,u,c,d=null,p=t?t.name:null,f=e,l=!0,h="";return e||(l=!1,e="_@r"+(A+=1)),c=o(e),d=c[0],e=c[1],d&&(d=i(d,p,n),s=getOwn(j,d)),e&&(d?h=s&&s.normalize?s.normalize(e,function(e){return i(e,p,n)}):e.indexOf("!")===-1?i(e,p,n):e:(h=i(e,p,n),c=o(h),d=c[0],h=c[1],r=!0,a=q.nameToUrl(h))),u=!d||s||r?"":"_unnormalized"+(T+=1),{prefix:d,name:h,parentMap:t,unnormalized:!!u,url:a,originalName:f,isDefine:l,id:(d?d+"!"+h:h)+u}}function s(e){var t=e.id,i=getOwn(S,t);return i||(i=S[t]=new q.Module(e)),i}function u(e,t,i){var r=e.id,n=getOwn(S,r);!hasProp(j,r)||n&&!n.defineEmitComplete?(n=s(e),n.error&&"error"===t?i(n.error):n.on(t,i)):"defined"===t&&i(j[r])}function c(e,t){var i=e.requireModules,r=!1;t?t(e):(each(i,function(t){var i=getOwn(S,t);i&&(i.error=e,i.events.error&&(r=!0,i.emit("error",e)))}),r||req.onError(e))}function d(){globalDefQueue.length&&(each(globalDefQueue,function(e){var t=e[0];"string"==typeof t&&(q.defQueueMap[t]=!0),O.push(e)}),globalDefQueue=[])}function p(e){delete S[e],delete k[e]}function f(e,t,i){var r=e.map.id;e.error?e.emit("error",e.error):(t[r]=!0,each(e.depMaps,function(r,n){var o=r.id,a=getOwn(S,o);!a||e.depMatched[n]||i[o]||(getOwn(t,o)?(e.defineDep(n,j[o]),e.check()):f(a,t,i))}),i[r]=!0)}function l(){var e,t,i=1e3*y.waitSeconds,o=i&&q.startTime+i<(new Date).getTime(),a=[],s=[],u=!1,d=!0;if(!x){if(x=!0,eachProp(k,function(e){var i=e.map,c=i.id;if(e.enabled&&(i.isDefine||s.push(e),!e.error))if(!e.inited&&o)n(c)?(t=!0,u=!0):(a.push(c),r(c));else if(!e.inited&&e.fetched&&i.isDefine&&(u=!0,!i.prefix))return d=!1}),o&&a.length)return e=makeError("timeout","Load timeout for modules: "+a,null,a),e.contextName=q.contextName,c(e);d&&each(s,function(e){f(e,{},{})}),o&&!t||!u||!isBrowser&&!isWebWorker||w||(w=setTimeout(function(){w=0,l()},50)),x=!1}}function h(e){hasProp(j,e[0])||s(a(e[0],null,!0)).init(e[1],e[2])}function m(e,t,i,r){e.detachEvent&&!isOpera?r&&e.detachEvent(r,t):e.removeEventListener(i,t,!1)}function g(e){var t=e.currentTarget||e.srcElement;return m(t,q.onScriptLoad,"load","onreadystatechange"),m(t,q.onScriptError,"error"),{node:t,id:t&&t.getAttribute("data-requiremodule")}}function v(){var e;for(d();O.length;){if(e=O.shift(),null===e[0])return c(makeError("mismatch","Mismatched anonymous define() module: "+e[e.length-1]));h(e)}q.defQueueMap={}}var x,b,q,E,w,y={waitSeconds:7,baseUrl:"./",paths:{},bundles:{},pkgs:{},shim:{},config:{}},S={},k={},M={},O=[],j={},P={},R={},A=1,T=1;return E={require:function(e){return e.require?e.require:e.require=q.makeRequire(e.map)},exports:function(e){if(e.usingExports=!0,e.map.isDefine)return e.exports?j[e.map.id]=e.exports:e.exports=j[e.map.id]={}},module:function(e){return e.module?e.module:e.module={id:e.map.id,uri:e.map.url,config:function(){return getOwn(y.config,e.map.id)||{}},exports:e.exports||(e.exports={})}}},b=function(e){this.events=getOwn(M,e.id)||{},this.map=e,this.shim=getOwn(y.shim,e.id),this.depExports=[],this.depMaps=[],this.depMatched=[],this.pluginMaps={},this.depCount=0},b.prototype={init:function(e,t,i,r){r=r||{},this.inited||(this.factory=t,i?this.on("error",i):this.events.error&&(i=bind(this,function(e){this.emit("error",e)})),this.depMaps=e&&e.slice(0),this.errback=i,this.inited=!0,this.ignore=r.ignore,r.enabled||this.enabled?this.enable():this.check())},defineDep:function(e,t){this.depMatched[e]||(this.depMatched[e]=!0,this.depCount-=1,this.depExports[e]=t)},fetch:function(){if(!this.fetched){this.fetched=!0,q.startTime=(new Date).getTime();var e=this.map;return this.shim?void q.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],bind(this,function(){return e.prefix?this.callPlugin():this.load()})):e.prefix?this.callPlugin():this.load()}},load:function(){var e=this.map.url;P[e]||(P[e]=!0,q.load(this.map.id,e))},check:function(){if(this.enabled&&!this.enabling){var e,t,i=this.map.id,r=this.depExports,n=this.exports,o=this.factory;if(this.inited){if(this.error)this.emit("error",this.error);else if(!this.defining){if(this.defining=!0,this.depCount<1&&!this.defined){if(isFunction(o)){if(this.events.error&&this.map.isDefine||req.onError!==defaultOnError)try{n=q.execCb(i,o,r,n)}catch(t){e=t}else n=q.execCb(i,o,r,n);if(this.map.isDefine&&void 0===n&&(t=this.module,t?n=t.exports:this.usingExports&&(n=this.exports)),e)return e.requireMap=this.map,e.requireModules=this.map.isDefine?[this.map.id]:null,e.requireType=this.map.isDefine?"define":"require",c(this.error=e)}else n=o;if(this.exports=n,this.map.isDefine&&!this.ignore&&(j[i]=n,req.onResourceLoad)){var a=[];each(this.depMaps,function(e){a.push(e.normalizedMap||e)}),req.onResourceLoad(q,this.map,a)}p(i),this.defined=!0}this.defining=!1,this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else hasProp(q.defQueueMap,i)||this.fetch()}},callPlugin:function(){var e=this.map,t=e.id,r=a(e.prefix);this.depMaps.push(r),u(r,"defined",bind(this,function(r){var n,o,d,f=getOwn(R,this.map.id),l=this.map.name,h=this.map.parentMap?this.map.parentMap.name:null,m=q.makeRequire(e.parentMap,{enableBuildCallback:!0});return this.map.unnormalized?(r.normalize&&(l=r.normalize(l,function(e){return i(e,h,!0)})||""),o=a(e.prefix+"!"+l,this.map.parentMap),u(o,"defined",bind(this,function(e){this.map.normalizedMap=o,this.init([],function(){return e},null,{enabled:!0,ignore:!0})})),d=getOwn(S,o.id),void(d&&(this.depMaps.push(o),this.events.error&&d.on("error",bind(this,function(e){this.emit("error",e)})),d.enable()))):f?(this.map.url=q.nameToUrl(f),void this.load()):(n=bind(this,function(e){this.init([],function(){return e},null,{enabled:!0})}),n.error=bind(this,function(e){this.inited=!0,this.error=e,e.requireModules=[t],eachProp(S,function(e){0===e.map.id.indexOf(t+"_unnormalized")&&p(e.map.id)}),c(e)}),n.fromText=bind(this,function(i,r){var o=e.name,u=a(o),d=useInteractive;r&&(i=r),d&&(useInteractive=!1),s(u),hasProp(y.config,t)&&(y.config[o]=y.config[t]);try{req.exec(i)}catch(e){return c(makeError("fromtexteval","fromText eval for "+t+" failed: "+e,e,[t]))}d&&(useInteractive=!0),this.depMaps.push(u),q.completeLoad(o),m([o],n)}),void r.load(e.name,m,n,y))})),q.enable(r,this),this.pluginMaps[r.id]=r},enable:function(){k[this.map.id]=this,this.enabled=!0,this.enabling=!0,each(this.depMaps,bind(this,function(e,t){var i,r,n;if("string"==typeof e){if(e=a(e,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap),this.depMaps[t]=e,n=getOwn(E,e.id))return void(this.depExports[t]=n(this));this.depCount+=1,u(e,"defined",bind(this,function(e){this.undefed||(this.defineDep(t,e),this.check())})),this.errback?u(e,"error",bind(this,this.errback)):this.events.error&&u(e,"error",bind(this,function(e){this.emit("error",e)}))}i=e.id,r=S[i],hasProp(E,i)||!r||r.enabled||q.enable(e,this)})),eachProp(this.pluginMaps,bind(this,function(e){var t=getOwn(S,e.id);t&&!t.enabled&&q.enable(e,this)})),this.enabling=!1,this.check()},on:function(e,t){var i=this.events[e];i||(i=this.events[e]=[]),i.push(t)},emit:function(e,t){each(this.events[e],function(e){e(t)}),"error"===e&&delete this.events[e]}},q={config:y,contextName:e,registry:S,defined:j,urlFetched:P,defQueue:O,defQueueMap:{},Module:b,makeModuleMap:a,nextTick:req.nextTick,onError:c,configure:function(e){if(e.baseUrl&&"/"!==e.baseUrl.charAt(e.baseUrl.length-1)&&(e.baseUrl+="/"),"string"==typeof e.urlArgs){var t=e.urlArgs;e.urlArgs=function(e,i){return(i.indexOf("?")===-1?"?":"&")+t}}var i=y.shim,r={paths:!0,bundles:!0,config:!0,map:!0};eachProp(e,function(e,t){r[t]?(y[t]||(y[t]={}),mixin(y[t],e,!0,!0)):y[t]=e}),e.bundles&&eachProp(e.bundles,function(e,t){each(e,function(e){e!==t&&(R[e]=t)})}),e.shim&&(eachProp(e.shim,function(e,t){isArray(e)&&(e={deps:e}),!e.exports&&!e.init||e.exportsFn||(e.exportsFn=q.makeShimExports(e)),i[t]=e}),y.shim=i),e.packages&&each(e.packages,function(e){var t,i;e="string"==typeof e?{name:e}:e,i=e.name,t=e.location,t&&(y.paths[i]=e.location),y.pkgs[i]=e.name+"/"+(e.main||"main").replace(currDirRegExp,"").replace(jsSuffixRegExp,"")}),eachProp(S,function(e,t){e.inited||e.map.unnormalized||(e.map=a(t,null,!0))}),(e.deps||e.callback)&&q.require(e.deps||[],e.callback)},makeShimExports:function(e){function t(){var t;return e.init&&(t=e.init.apply(global,arguments)),t||e.exports&&getGlobal(e.exports)}return t},makeRequire:function(t,n){function o(i,r,u){var d,p,f;return n.enableBuildCallback&&r&&isFunction(r)&&(r.__requireJsBuild=!0),"string"==typeof i?isFunction(r)?c(makeError("requireargs","Invalid require call"),u):t&&hasProp(E,i)?E[i](S[t.id]):req.get?req.get(q,i,t,o):(p=a(i,t,!1,!0),d=p.id,hasProp(j,d)?j[d]:c(makeError("notloaded",'Module name "'+d+'" has not been loaded yet for context: '+e+(t?"":". Use require([])")))):(v(),q.nextTick(function(){v(),f=s(a(null,t)),f.skipMap=n.skipMap,f.init(i,r,u,{enabled:!0}),l()}),o)}return n=n||{},mixin(o,{isBrowser:isBrowser,toUrl:function(e){var r,n=e.lastIndexOf("."),o=e.split("/")[0],a="."===o||".."===o;return n!==-1&&(!a||n>1)&&(r=e.substring(n,e.length),e=e.substring(0,n)),q.nameToUrl(i(e,t&&t.id,!0),r,!0)},defined:function(e){return hasProp(j,a(e,t,!1,!0).id)},specified:function(e){return e=a(e,t,!1,!0).id,hasProp(j,e)||hasProp(S,e)}}),t||(o.undef=function(e){d();var i=a(e,t,!0),n=getOwn(S,e);n.undefed=!0,r(e),delete j[e],delete P[i.url],delete M[e],eachReverse(O,function(t,i){t[0]===e&&O.splice(i,1)}),delete q.defQueueMap[e],n&&(n.events.defined&&(M[e]=n.events),p(e))}),o},enable:function(e){var t=getOwn(S,e.id);t&&s(e).enable()},completeLoad:function(e){var t,i,r,o=getOwn(y.shim,e)||{},a=o.exports;for(d();O.length;){if(i=O.shift(),null===i[0]){if(i[0]=e,t)break;t=!0}else i[0]===e&&(t=!0);h(i)}if(q.defQueueMap={},r=getOwn(S,e),!t&&!hasProp(j,e)&&r&&!r.inited){if(!(!y.enforceDefine||a&&getGlobal(a)))return n(e)?void 0:c(makeError("nodefine","No define call for "+e,null,[e]));h([e,o.deps||[],o.exportsFn])}l()},nameToUrl:function(e,t,i){var r,n,o,a,s,u,c,d=getOwn(y.pkgs,e);if(d&&(e=d),c=getOwn(R,e))return q.nameToUrl(c,t,i);if(req.jsExtRegExp.test(e))s=e+(t||"");else{for(r=y.paths,n=e.split("/"),o=n.length;o>0;o-=1)if(a=n.slice(0,o).join("/"),u=getOwn(r,a)){isArray(u)&&(u=u[0]),n.splice(0,o,u);break}s=n.join("/"),s+=t||(/^data\:|^blob\:|\?/.test(s)||i?"":".js"),s=("/"===s.charAt(0)||s.match(/^[\w\+\.\-]+:/)?"":y.baseUrl)+s}return y.urlArgs&&!/^blob\:/.test(s)?s+y.urlArgs(e,s):s},load:function(e,t){req.load(q,e,t)},execCb:function(e,t,i,r){return t.apply(r,i)},onScriptLoad:function(e){if("load"===e.type||readyRegExp.test((e.currentTarget||e.srcElement).readyState)){interactiveScript=null;var t=g(e);q.completeLoad(t.id)}},onScriptError:function(e){var t=g(e);if(!n(t.id)){var i=[];return eachProp(S,function(e,r){0!==r.indexOf("_@r")&&each(e.depMaps,function(e){if(e.id===t.id)return i.push(r),!0})}),c(makeError("scripterror",'Script error for "'+t.id+(i.length?'", needed by: '+i.join(", "):'"'),e,[t.id]))}}},q.require=q.makeRequire(),q}function getInteractiveScript(){return interactiveScript&&"interactive"===interactiveScript.readyState?interactiveScript:(eachReverse(scripts(),function(e){if("interactive"===e.readyState)return interactiveScript=e}),interactiveScript)}var req,s,head,baseElement,dataMain,src,interactiveScript,currentlyAddingScript,mainScript,subPath,version="2.3.1",commentRegExp=/\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/gm,cjsRequireRegExp=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,jsSuffixRegExp=/\.js$/,currDirRegExp=/^\.\//,op=Object.prototype,ostring=op.toString,hasOwn=op.hasOwnProperty,isBrowser=!("undefined"==typeof window||"undefined"==typeof navigator||!window.document),isWebWorker=!isBrowser&&"undefined"!=typeof importScripts,readyRegExp=isBrowser&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,defContextName="_",isOpera="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),contexts={},cfg={},globalDefQueue=[],useInteractive=!1;if("undefined"==typeof define){if("undefined"!=typeof requirejs){if(isFunction(requirejs))return;cfg=requirejs,requirejs=void 0}"undefined"==typeof require||isFunction(require)||(cfg=require,require=void 0),req=requirejs=function(e,t,i,r){var n,o,a=defContextName;return isArray(e)||"string"==typeof e||(o=e,isArray(t)?(e=t,t=i,i=r):e=[]),o&&o.context&&(a=o.context),n=getOwn(contexts,a),n||(n=contexts[a]=req.s.newContext(a)),o&&n.configure(o),n.require(e,t,i)},req.config=function(e){return req(e)},req.nextTick="undefined"!=typeof setTimeout?function(e){setTimeout(e,4)}:function(e){e()},require||(require=req),req.version=version,req.jsExtRegExp=/^\/|:|\?|\.js$/,req.isBrowser=isBrowser,s=req.s={contexts:contexts,newContext:newContext},req({}),each(["toUrl","undef","defined","specified"],function(e){req[e]=function(){var t=contexts[defContextName];return t.require[e].apply(t,arguments)}}),isBrowser&&(head=s.head=document.getElementsByTagName("head")[0],baseElement=document.getElementsByTagName("base")[0],baseElement&&(head=s.head=baseElement.parentNode)),req.onError=defaultOnError,req.createNode=function(e,t,i){var r=e.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script");return r.type=e.scriptType||"text/javascript",r.charset="utf-8",r.async=!0,r},req.load=function(e,t,i){var r,n=e&&e.config||{};if(isBrowser)return r=req.createNode(n,t,i),r.setAttribute("data-requirecontext",e.contextName),r.setAttribute("data-requiremodule",t),!r.attachEvent||r.attachEvent.toString&&r.attachEvent.toString().indexOf("[native code")<0||isOpera?(r.addEventListener("load",e.onScriptLoad,!1),r.addEventListener("error",e.onScriptError,!1)):(useInteractive=!0,r.attachEvent("onreadystatechange",e.onScriptLoad)),r.src=i,n.onNodeCreated&&n.onNodeCreated(r,n,t,i),currentlyAddingScript=r,baseElement?head.insertBefore(r,baseElement):head.appendChild(r),currentlyAddingScript=null,r;if(isWebWorker)try{setTimeout(function(){},0),importScripts(i),e.completeLoad(t)}catch(r){e.onError(makeError("importscripts","importScripts failed for "+t+" at "+i,r,[t]))}},isBrowser&&!cfg.skipDataMain&&eachReverse(scripts(),function(e){if(head||(head=e.parentNode),dataMain=e.getAttribute("data-main"))return mainScript=dataMain,cfg.baseUrl||mainScript.indexOf("!")!==-1||(src=mainScript.split("/"),mainScript=src.pop(),subPath=src.length?src.join("/")+"/":"./",cfg.baseUrl=subPath),mainScript=mainScript.replace(jsSuffixRegExp,""),req.jsExtRegExp.test(mainScript)&&(mainScript=dataMain),cfg.deps=cfg.deps?cfg.deps.concat(mainScript):[mainScript],!0}),define=function(e,t,i){var r,n;"string"!=typeof e&&(i=t,t=e,e=null),isArray(t)||(i=t,t=null),!t&&isFunction(i)&&(t=[],i.length&&(i.toString().replace(commentRegExp,commentReplace).replace(cjsRequireRegExp,function(e,i){t.push(i)}),t=(1===i.length?["require"]:["require","exports","module"]).concat(t))),useInteractive&&(r=currentlyAddingScript||getInteractiveScript(),r&&(e||(e=r.getAttribute("data-requiremodule")),n=contexts[r.getAttribute("data-requirecontext")])),n?(n.defQueue.push([e,t,i]),n.defQueueMap[e]=!0):globalDefQueue.push([e,t,i])},define.amd={jQuery:!0},req.exec=function(text){return eval(text)},req(cfg)}}(this,setTimeout);
--------------------------------------------------------------------------------
/js/app/FurRenderer.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | define([
4 | 'framework/BaseRenderer',
5 | 'jquery',
6 | 'FurShader',
7 | 'DiffuseShader',
8 | 'DiffuseColoredShader',
9 | 'framework/utils/MatrixUtils',
10 | 'framework/FullModel',
11 | 'framework/UncompressedTextureLoader',
12 | 'framework/CompressedTextureLoader',
13 | 'FurPresets',
14 | 'VignetteData'
15 | ],
16 | function(
17 | BaseRenderer,
18 | $,
19 | FurShader,
20 | DiffuseShader,
21 | DiffuseColoredShader,
22 | MatrixUtils,
23 | FullModel,
24 | UncompressedTextureLoader,
25 | CompressedTextureLoader,
26 | FurPresets,
27 | VignetteData) {
28 |
29 | class FurRenderer extends BaseRenderer {
30 | constructor() {
31 | super();
32 |
33 | this.loadedItemsCount = 0; // couter of loaded OpenGL buffers+textures
34 | this.loaded = false; // won't draw until this is true
35 |
36 | this.angleYaw = 0; // camera rotation angle
37 | this.lastTime = 0; // used for animating camera
38 | this.furTimer = 0;
39 | this.windTimer = 0;
40 | this.loadingNextFur = false;
41 |
42 | this.currentPreset = null;
43 | this.nextPreset = null;
44 |
45 | this.matOrtho = MatrixUtils.mat4.create();
46 | MatrixUtils.mat4.ortho(this.matOrtho, -1, 1, -1, 1, 2.0, 250);
47 |
48 | this.ITEMS_TO_LOAD = 4; // total number of OpenGL buffers+textures to load
49 | this.FLOAT_SIZE_BYTES = 4; // float size, used to calculate stride sizes
50 | this.TRIANGLE_VERTICES_DATA_STRIDE_BYTES = 5 * this.FLOAT_SIZE_BYTES;
51 | this.TRIANGLE_VERTICES_DATA_POS_OFFSET = 0;
52 | this.TRIANGLE_VERTICES_DATA_UV_OFFSET = 3;
53 | this.FOV_LANDSCAPE = 25.0; // FOV for landscape
54 | this.FOV_PORTRAIT = 40.0; // FOV for portrait
55 | this.YAW_COEFF_NORMAL = 12000.0; // camera rotation speed
56 | this.DISTANCE_TO_NEXT_CUBE = 200;
57 |
58 | this.FUR_ANIMATION_SPEED = 1500.0;
59 | this.FUR_WIND_SPEED = 8310.0;
60 | this.FUR_STIFFNESS = 2.75;
61 | }
62 |
63 | /**
64 | * Resets loaded state for renderer
65 | */
66 | resetLoaded() {
67 | this.loaded = false;
68 | this.loadedItemsCount = 0;
69 | }
70 |
71 | onAfterInit() {
72 | super.onAfterInit();
73 |
74 | if (!this.isWebGL2) {
75 | this.onInitError();
76 | }
77 | }
78 |
79 | onBeforeInit() {
80 | super.onBeforeInit();
81 |
82 | $('#canvasGL').show();
83 | }
84 |
85 | onInitError() {
86 | super.onInitError();
87 |
88 | $('#canvasGL').hide();
89 | $('#alertError').show();
90 | }
91 |
92 | initShaders() {
93 | this.shaderDiffuse = new DiffuseShader();
94 | this.shaderDiffuseColored = new DiffuseColoredShader();
95 | this.shaderFur = new FurShader();
96 | }
97 |
98 | /**
99 | * Callback for all loading function. Updates loading progress and allows rendering after loading all stuff
100 | */
101 | updateLoadedObjectsCount() {
102 | var percent,
103 | $progress = $('#progressLoading');
104 |
105 | this.loadedItemsCount++; // increase loaded objects counter
106 |
107 | percent = Math.floor(this.loadedItemsCount * 100 / this.ITEMS_TO_LOAD) + '%';
108 | $progress
109 | .css('width', percent)
110 | .html(percent); // update loading progress
111 |
112 | if (this.loadedItemsCount >= this.ITEMS_TO_LOAD) {
113 | this.loaded = true; // allow rendering
114 | console.log('Loaded all assets');
115 | $('#row-progress').hide();
116 | $('.control-icon').show();
117 | this.onPresetLoaded && this.onPresetLoaded();
118 | }
119 | }
120 |
121 | /**
122 | * loads all WebGL buffers and textures. Uses updateLoadedObjectsCount() callback to indicate that data is loaded to GPU
123 | */
124 | loadData() {
125 | var boundUpdateCallback = this.updateLoadedObjectsCount.bind(this);
126 |
127 | this.modelCube = new FullModel();
128 | this.modelCube.load('data/models/box10_rounded', boundUpdateCallback);
129 | // this.textureChecker = UncompressedTextureLoader.load('data/textures/checker.png', boundUpdateCallback);
130 | this.textureBackground = UncompressedTextureLoader.load('data/textures/bg-gradient.png', boundUpdateCallback);
131 |
132 | this.currentPreset = Object.assign({}, FurPresets.current());
133 |
134 | this.textureFurDiffuse = UncompressedTextureLoader.load('data/textures/' + this.getCurrentPresetParameter('diffuseTexture'), boundUpdateCallback);
135 | this.textureFurAlpha = UncompressedTextureLoader.load('data/textures/' + this.getCurrentPresetParameter('alphaTexture'), boundUpdateCallback);
136 |
137 | this.vignette = new VignetteData();
138 | this.vignette.initGL(gl);
139 | }
140 |
141 | getCurrentPresetParameter(param) {
142 | return this.currentPreset[param];
143 | }
144 |
145 | getNextPresetParameter(param) {
146 | return this.nextPreset[param];
147 | }
148 |
149 | loadNextFurTextures(callback) {
150 | this.textureFurDiffuseNext && gl.deleteTexture(this.textureFurDiffuseNext);
151 | this.textureFurAlphaNext && gl.deleteTexture(this.textureFurAlphaNext);
152 |
153 | this.textureFurDiffuseNext = UncompressedTextureLoader.load('data/textures/' + this.getNextPresetParameter('diffuseTexture'), callback);
154 | this.textureFurAlphaNext = UncompressedTextureLoader.load('data/textures/' + this.getNextPresetParameter('alphaTexture'), callback);
155 | }
156 |
157 | get layers() {
158 | return this.currentPreset['layers'];
159 | }
160 |
161 | set layers(value) {
162 | this.currentPreset['layers'] = value;
163 | }
164 |
165 | get thickness() {
166 | return this.currentPreset['thickness'];
167 | }
168 |
169 | set thickness(value) {
170 | this.currentPreset['thickness'] = value;
171 | }
172 |
173 | get presetName() {
174 | return this.currentPreset['name'];
175 | }
176 |
177 | loadPreset(preset) {
178 | var root = this,
179 | counter = 0;
180 |
181 | this.nextPreset = preset;
182 | this.loadingNextFur = true;
183 |
184 | root.loadNextFurTextures(function() {
185 | counter++;
186 | if (counter == 2) {
187 | root.loadingNextFur = false;
188 | }
189 | });
190 | }
191 |
192 | chooseNextPreset() {
193 | this.loadPreset(FurPresets.next());
194 | }
195 |
196 | choosePreviousPreset() {
197 | this.loadPreset(FurPresets.previous());
198 | }
199 |
200 | /**
201 | * Loads either ETC1 from PKM or falls back to loading PNG
202 | * @param {string} url - URL to texture without extension
203 | */
204 | loadETC1WithFallback(url) {
205 | var boundUpdateCallback = this.updateLoadedObjectsCount.bind(this);
206 |
207 | if (this.isETC1Supported) {
208 | return CompressedTextureLoader.loadETC1(url + '.pkm', boundUpdateCallback);
209 | } else {
210 | return UncompressedTextureLoader.load(url + '.png', boundUpdateCallback);
211 | }
212 | }
213 |
214 | /**
215 | * Calculates camera matrix
216 | * @param {unmber} a - position in [0...1] range
217 | */
218 | positionCamera(a) {
219 | MatrixUtils.mat4.identity(this.mVMatrix);
220 | MatrixUtils.mat4.lookAt(this.mVMatrix, [190, 0, 270], [0, 0, 0], [0, 0, 1]);
221 | }
222 |
223 | /**
224 | * Calculates projection matrix
225 | */
226 | setCameraFOV(multiplier) {
227 | var ratio;
228 |
229 | if (gl.canvas.height > 0) {
230 | ratio = gl.canvas.width / gl.canvas.height;
231 | } else {
232 | ratio = 1.0;
233 | }
234 |
235 | if (gl.canvas.width >= gl.canvas.height) {
236 | this.setFOV(this.mProjMatrix, this.FOV_LANDSCAPE * multiplier, ratio, 20.0, 1000.0);
237 | } else {
238 | this.setFOV(this.mProjMatrix, this.FOV_PORTRAIT * multiplier, ratio, 20.0, 1000.0);
239 | }
240 | }
241 |
242 | /**
243 | * Issues actual draw calls
244 | */
245 | drawScene() {
246 | if (!this.loaded) {
247 | return;
248 | }
249 |
250 | if (!this.loadingNextFur) {
251 | if (this.textureFurDiffuseNext && this.textureFurAlphaNext) {
252 | this.currentPreset = Object.assign({}, FurPresets.current());
253 | this.onPresetLoaded && this.onPresetLoaded();
254 | gl.deleteTexture(this.textureFurDiffuse);
255 | gl.deleteTexture(this.textureFurAlpha);
256 | this.textureFurDiffuse = this.textureFurDiffuseNext;
257 | this.textureFurAlpha = this.textureFurAlphaNext;
258 | this.textureFurDiffuseNext = null;
259 | this.textureFurAlphaNext = null;
260 | }
261 | }
262 |
263 | gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
264 | gl.clearColor(0.3, 0.3, 0.3, 1.0);
265 | gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
266 |
267 | gl.enable(gl.DEPTH_TEST);
268 | gl.enable(gl.CULL_FACE);
269 | gl.cullFace(gl.BACK);
270 |
271 | gl.depthMask(false);
272 | this.drawVignette(this.textureBackground);
273 | gl.depthMask(true);
274 |
275 | this.positionCamera(0.0);
276 | this.setCameraFOV(0.6);
277 |
278 | this.drawCubeDiffuse(this.textureFurDiffuse, this.currentPreset);
279 |
280 | gl.disable(gl.CULL_FACE);
281 | gl.enable(gl.BLEND);
282 | // gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); // too dim
283 | // gl.blendFunc(gl.SRC_ALPHA, gl.ONE); // too bright
284 | gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE);
285 |
286 | this.drawFur(this.textureFurDiffuse, this.textureFurAlpha, this.currentPreset);
287 |
288 | gl.disable(gl.BLEND);
289 | }
290 |
291 | drawVignette(texture) {
292 | this.shaderDiffuse.use();
293 |
294 | this.setTexture2D(0, texture, this.shaderDiffuse.sTexture);
295 |
296 | gl.bindBuffer(gl.ARRAY_BUFFER, this.vignette.buffer);
297 |
298 | gl.vertexAttribPointer(this.shaderDiffuse.rm_Vertex, 3, gl.FLOAT, false, this.TRIANGLE_VERTICES_DATA_STRIDE_BYTES, this.TRIANGLE_VERTICES_DATA_POS_OFFSET * this.FLOAT_SIZE_BYTES);
299 | gl.enableVertexAttribArray(this.shaderDiffuse.rm_Vertex);
300 |
301 | gl.vertexAttribPointer(this.shaderDiffuse.rm_TexCoord0, 2, gl.FLOAT, false, this.TRIANGLE_VERTICES_DATA_STRIDE_BYTES, this.TRIANGLE_VERTICES_DATA_UV_OFFSET * this.FLOAT_SIZE_BYTES);
302 | gl.enableVertexAttribArray(this.shaderDiffuse.rm_TexCoord0);
303 |
304 | gl.uniformMatrix4fv(this.shaderDiffuse.view_proj_matrix, false, this.matOrtho);
305 | gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
306 | }
307 |
308 |
309 | drawCubeDiffuse(texture, preset) {
310 | this.shaderDiffuseColored.use();
311 | this.setTexture2D(0, texture, this.shaderDiffuseColored.sTexture);
312 | gl.uniform4f(this.shaderDiffuseColored.color, preset.startColor[0], preset.startColor[1], preset.startColor[2], preset.startColor[3]);
313 | this.drawDiffuseNormalStrideVBOTranslatedRotatedScaled(this.shaderDiffuseColored, this.modelCube, 0, 0, 0, 0, 0, this.angleYaw, 1, 1, 1);
314 | }
315 |
316 | drawLoadingCube() {
317 | this.shaderDiffuseColored.use();
318 | this.setTexture2D(0, this.textureChecker, this.shaderDiffuseColored.sTexture);
319 | gl.uniform4f(this.shaderDiffuseColored.color, 0.8, 0.8, 0.8, 1);
320 | this.drawDiffuseNormalStrideVBOTranslatedRotatedScaled(this.shaderDiffuseColored, this.modelCube, 0, 0, 0, 0, 0, this.angleYaw, 1, 1, 1);
321 | }
322 |
323 | drawFur(textureDiffuse, textureAlpha, preset) {
324 | this.shaderFur.use();
325 | this.setTexture2D(0, textureDiffuse, this.shaderFur.diffuseMap);
326 | this.setTexture2D(1, textureAlpha, this.shaderFur.alphaMap);
327 | this.drawFurVBOTranslatedRotatedScaledInstanced(preset, this.shaderFur, this.modelCube, 0, 0, 0, 0, 0, this.angleYaw, 1, 1, 1);
328 | }
329 |
330 | drawDiffuseNormalStrideVBOTranslatedRotatedScaled(shader, model, tx, ty, tz, rx, ry, rz, sx, sy, sz) {
331 | model.bindBuffers();
332 |
333 | gl.enableVertexAttribArray(shader.rm_Vertex);
334 | gl.enableVertexAttribArray(shader.rm_TexCoord0);
335 |
336 | gl.vertexAttribPointer(shader.rm_Vertex, 3, gl.FLOAT, false, 4 * (3 + 2 + 3), 0);
337 | gl.vertexAttribPointer(shader.rm_TexCoord0, 2, gl.FLOAT, false, 4 * (3 + 2 + 3), 4 * (3));
338 |
339 | this.calculateMVPMatrix(tx, ty, tz, rx, ry, rz, sx, sy, sz);
340 |
341 | gl.uniformMatrix4fv(shader.view_proj_matrix, false, this.mMVPMatrix);
342 | gl.drawElements(gl.TRIANGLES, model.getNumIndices() * 3, gl.UNSIGNED_SHORT, 0);
343 | }
344 |
345 | drawFurVBOTranslatedRotatedScaledInstanced(preset, shader, model, tx, ty, tz, rx, ry, rz, sx, sy, sz) {
346 | var a = Math.sin(this.windTimer * 6.2831852) / 2 + 0.5,
347 | scale = preset.waveScale * 0.4 + (a * preset.waveScale * 0.6);
348 |
349 | model.bindBuffers();
350 |
351 | gl.enableVertexAttribArray(shader.rm_Vertex);
352 | gl.enableVertexAttribArray(shader.rm_TexCoord0);
353 | gl.enableVertexAttribArray(shader.rm_Normal);
354 |
355 | gl.vertexAttribPointer(shader.rm_Vertex, 3, gl.FLOAT, false, 4 * (3 + 2 + 3), 0);
356 | gl.vertexAttribPointer(shader.rm_TexCoord0, 2, gl.FLOAT, false, 4 * (3 + 2 + 3), 4 * (3));
357 | gl.vertexAttribPointer(shader.rm_Normal, 3, gl.FLOAT, false, 4 * (3 + 2 + 3), 4 * (3 + 2));
358 |
359 | this.calculateMVPMatrix(tx, ty, tz, rx, ry, rz, sx, sy, sz);
360 |
361 | gl.uniformMatrix4fv(shader.view_proj_matrix, false, this.mMVPMatrix);
362 | gl.uniform1f(shader.layerThickness, preset.thickness);
363 | gl.uniform1f(shader.layersCount, preset.layers);
364 | gl.uniform4f(shader.colorStart, preset.startColor[0], preset.startColor[1], preset.startColor[2], preset.startColor[3]);
365 | gl.uniform4f(shader.colorEnd, preset.endColor[0], preset.endColor[1], preset.endColor[2], preset.endColor[3]);
366 | gl.uniform1f(shader.time, this.furTimer);
367 | gl.uniform1f(shader.waveScale, scale);
368 | gl.uniform1f(shader.stiffness, this.FUR_STIFFNESS);
369 | gl.drawElementsInstanced(gl.TRIANGLES, model.getNumIndices() * 3, gl.UNSIGNED_SHORT, 0, preset.layers);
370 | }
371 |
372 | /**
373 | * Updates camera rotation
374 | */
375 | animate() {
376 | var timeNow = new Date().getTime(),
377 | elapsed;
378 |
379 | if (this.lastTime != 0) {
380 | elapsed = timeNow - this.lastTime;
381 |
382 | this.angleYaw += elapsed / this.YAW_COEFF_NORMAL;
383 | this.angleYaw %= 360.0;
384 |
385 | this.furTimer += elapsed / this.FUR_ANIMATION_SPEED;
386 | this.furTimer %= 1.0;
387 |
388 | this.windTimer += elapsed / this.FUR_WIND_SPEED;
389 | this.windTimer %= 1.0;
390 | }
391 |
392 | this.lastTime = timeNow;
393 | }
394 | }
395 |
396 | return FurRenderer;
397 | });
398 |
--------------------------------------------------------------------------------
/styles/css/theme.min.css:
--------------------------------------------------------------------------------
1 | /*! Generated by Live LESS Theme Customizer */
2 | .label,sub,sup{vertical-align:baseline}
3 | body,figure{margin:0}
4 | .navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px}
5 | html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-size:10px;-webkit-tap-highlight-color:transparent}
6 | article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}
7 | audio,canvas,progress,video{display:inline-block;vertical-align:baseline}
8 | audio:not([controls]){display:none;height:0}
9 | [hidden],template{display:none}
10 | a{background-color:transparent}
11 | a:active,a:hover{outline:0}
12 | b,optgroup,strong{font-weight:700}
13 | dfn{font-style:italic}
14 | h1{margin:.67em 0}
15 | mark{background:#ff0;color:#000}
16 | sub,sup{font-size:75%;line-height:0;position:relative}
17 | sup{top:-.5em}
18 | sub{bottom:-.25em}
19 | img{border:0;vertical-align:middle}
20 | svg:not(:root){overflow:hidden}
21 | hr{box-sizing:content-box;height:0}
22 | pre,textarea{overflow:auto}
23 | code,kbd,pre,samp{font-size:1em}
24 | button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}
25 | button{overflow:visible}
26 | button,select{text-transform:none}
27 | button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}
28 | button[disabled],html input[disabled]{cursor:default}
29 | button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
30 | input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}
31 | input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}
32 | input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}
33 | table{border-collapse:collapse;border-spacing:0}
34 | td,th{padding:0}
35 | @media print{blockquote,img,pre,tr{page-break-inside:avoid}
36 | *,:after,:before{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}
37 | a,a:visited{text-decoration:underline}
38 | a[href]:after{content:" (" attr(href) ")"}
39 | abbr[title]:after{content:" (" attr(title) ")"}
40 | a[href^="javascript:"]:after,a[href^="#"]:after{content:""}
41 | blockquote,pre{border:1px solid #999}
42 | thead{display:table-header-group}
43 | img{max-width:100%!important}
44 | h2,h3,p{orphans:3;widows:3}
45 | h2,h3{page-break-after:avoid}
46 | .navbar{display:none}
47 | .btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}
48 | .label{border:1px solid #000}
49 | .table{border-collapse:collapse!important}
50 | .table td,.table th{background-color:#fff!important}
51 | .table-bordered td,.table-bordered th{border:1px solid #ddd!important}
52 | }
53 | .img-thumbnail,body{background-color:#fff}
54 | .btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-primary,.open>.dropdown-toggle.btn-warning{background-image:none}
55 | @font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}
56 | .glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
57 | .glyphicon-asterisk:before{content:"\002a"}
58 | .glyphicon-plus:before{content:"\002b"}
59 | .glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}
60 | .glyphicon-minus:before{content:"\2212"}
61 | .glyphicon-cloud:before{content:"\2601"}
62 | .glyphicon-envelope:before{content:"\2709"}
63 | .glyphicon-pencil:before{content:"\270f"}
64 | .glyphicon-glass:before{content:"\e001"}
65 | .glyphicon-music:before{content:"\e002"}
66 | .glyphicon-search:before{content:"\e003"}
67 | .glyphicon-heart:before{content:"\e005"}
68 | .glyphicon-star:before{content:"\e006"}
69 | .glyphicon-star-empty:before{content:"\e007"}
70 | .glyphicon-user:before{content:"\e008"}
71 | .glyphicon-film:before{content:"\e009"}
72 | .glyphicon-th-large:before{content:"\e010"}
73 | .glyphicon-th:before{content:"\e011"}
74 | .glyphicon-th-list:before{content:"\e012"}
75 | .glyphicon-ok:before{content:"\e013"}
76 | .glyphicon-remove:before{content:"\e014"}
77 | .glyphicon-zoom-in:before{content:"\e015"}
78 | .glyphicon-zoom-out:before{content:"\e016"}
79 | .glyphicon-off:before{content:"\e017"}
80 | .glyphicon-signal:before{content:"\e018"}
81 | .glyphicon-cog:before{content:"\e019"}
82 | .glyphicon-trash:before{content:"\e020"}
83 | .glyphicon-home:before{content:"\e021"}
84 | .glyphicon-file:before{content:"\e022"}
85 | .glyphicon-time:before{content:"\e023"}
86 | .glyphicon-road:before{content:"\e024"}
87 | .glyphicon-download-alt:before{content:"\e025"}
88 | .glyphicon-download:before{content:"\e026"}
89 | .glyphicon-upload:before{content:"\e027"}
90 | .glyphicon-inbox:before{content:"\e028"}
91 | .glyphicon-play-circle:before{content:"\e029"}
92 | .glyphicon-repeat:before{content:"\e030"}
93 | .glyphicon-refresh:before{content:"\e031"}
94 | .glyphicon-list-alt:before{content:"\e032"}
95 | .glyphicon-lock:before{content:"\e033"}
96 | .glyphicon-flag:before{content:"\e034"}
97 | .glyphicon-headphones:before{content:"\e035"}
98 | .glyphicon-volume-off:before{content:"\e036"}
99 | .glyphicon-volume-down:before{content:"\e037"}
100 | .glyphicon-volume-up:before{content:"\e038"}
101 | .glyphicon-qrcode:before{content:"\e039"}
102 | .glyphicon-barcode:before{content:"\e040"}
103 | .glyphicon-tag:before{content:"\e041"}
104 | .glyphicon-tags:before{content:"\e042"}
105 | .glyphicon-book:before{content:"\e043"}
106 | .glyphicon-bookmark:before{content:"\e044"}
107 | .glyphicon-print:before{content:"\e045"}
108 | .glyphicon-camera:before{content:"\e046"}
109 | .glyphicon-font:before{content:"\e047"}
110 | .glyphicon-bold:before{content:"\e048"}
111 | .glyphicon-italic:before{content:"\e049"}
112 | .glyphicon-text-height:before{content:"\e050"}
113 | .glyphicon-text-width:before{content:"\e051"}
114 | .glyphicon-align-left:before{content:"\e052"}
115 | .glyphicon-align-center:before{content:"\e053"}
116 | .glyphicon-align-right:before{content:"\e054"}
117 | .glyphicon-align-justify:before{content:"\e055"}
118 | .glyphicon-list:before{content:"\e056"}
119 | .glyphicon-indent-left:before{content:"\e057"}
120 | .glyphicon-indent-right:before{content:"\e058"}
121 | .glyphicon-facetime-video:before{content:"\e059"}
122 | .glyphicon-picture:before{content:"\e060"}
123 | .glyphicon-map-marker:before{content:"\e062"}
124 | .glyphicon-adjust:before{content:"\e063"}
125 | .glyphicon-tint:before{content:"\e064"}
126 | .glyphicon-edit:before{content:"\e065"}
127 | .glyphicon-share:before{content:"\e066"}
128 | .glyphicon-check:before{content:"\e067"}
129 | .glyphicon-move:before{content:"\e068"}
130 | .glyphicon-step-backward:before{content:"\e069"}
131 | .glyphicon-fast-backward:before{content:"\e070"}
132 | .glyphicon-backward:before{content:"\e071"}
133 | .glyphicon-play:before{content:"\e072"}
134 | .glyphicon-pause:before{content:"\e073"}
135 | .glyphicon-stop:before{content:"\e074"}
136 | .glyphicon-forward:before{content:"\e075"}
137 | .glyphicon-fast-forward:before{content:"\e076"}
138 | .glyphicon-step-forward:before{content:"\e077"}
139 | .glyphicon-eject:before{content:"\e078"}
140 | .glyphicon-chevron-left:before{content:"\e079"}
141 | .glyphicon-chevron-right:before{content:"\e080"}
142 | .glyphicon-plus-sign:before{content:"\e081"}
143 | .glyphicon-minus-sign:before{content:"\e082"}
144 | .glyphicon-remove-sign:before{content:"\e083"}
145 | .glyphicon-ok-sign:before{content:"\e084"}
146 | .glyphicon-question-sign:before{content:"\e085"}
147 | .glyphicon-info-sign:before{content:"\e086"}
148 | .glyphicon-screenshot:before{content:"\e087"}
149 | .glyphicon-remove-circle:before{content:"\e088"}
150 | .glyphicon-ok-circle:before{content:"\e089"}
151 | .glyphicon-ban-circle:before{content:"\e090"}
152 | .glyphicon-arrow-left:before{content:"\e091"}
153 | .glyphicon-arrow-right:before{content:"\e092"}
154 | .glyphicon-arrow-up:before{content:"\e093"}
155 | .glyphicon-arrow-down:before{content:"\e094"}
156 | .glyphicon-share-alt:before{content:"\e095"}
157 | .glyphicon-resize-full:before{content:"\e096"}
158 | .glyphicon-resize-small:before{content:"\e097"}
159 | .glyphicon-exclamation-sign:before{content:"\e101"}
160 | .glyphicon-gift:before{content:"\e102"}
161 | .glyphicon-leaf:before{content:"\e103"}
162 | .glyphicon-fire:before{content:"\e104"}
163 | .glyphicon-eye-open:before{content:"\e105"}
164 | .glyphicon-eye-close:before{content:"\e106"}
165 | .glyphicon-warning-sign:before{content:"\e107"}
166 | .glyphicon-plane:before{content:"\e108"}
167 | .glyphicon-calendar:before{content:"\e109"}
168 | .glyphicon-random:before{content:"\e110"}
169 | .glyphicon-comment:before{content:"\e111"}
170 | .glyphicon-magnet:before{content:"\e112"}
171 | .glyphicon-chevron-up:before{content:"\e113"}
172 | .glyphicon-chevron-down:before{content:"\e114"}
173 | .glyphicon-retweet:before{content:"\e115"}
174 | .glyphicon-shopping-cart:before{content:"\e116"}
175 | .glyphicon-folder-close:before{content:"\e117"}
176 | .glyphicon-folder-open:before{content:"\e118"}
177 | .glyphicon-resize-vertical:before{content:"\e119"}
178 | .glyphicon-resize-horizontal:before{content:"\e120"}
179 | .glyphicon-hdd:before{content:"\e121"}
180 | .glyphicon-bullhorn:before{content:"\e122"}
181 | .glyphicon-bell:before{content:"\e123"}
182 | .glyphicon-certificate:before{content:"\e124"}
183 | .glyphicon-thumbs-up:before{content:"\e125"}
184 | .glyphicon-thumbs-down:before{content:"\e126"}
185 | .glyphicon-hand-right:before{content:"\e127"}
186 | .glyphicon-hand-left:before{content:"\e128"}
187 | .glyphicon-hand-up:before{content:"\e129"}
188 | .glyphicon-hand-down:before{content:"\e130"}
189 | .glyphicon-circle-arrow-right:before{content:"\e131"}
190 | .glyphicon-circle-arrow-left:before{content:"\e132"}
191 | .glyphicon-circle-arrow-up:before{content:"\e133"}
192 | .glyphicon-circle-arrow-down:before{content:"\e134"}
193 | .glyphicon-globe:before{content:"\e135"}
194 | .glyphicon-wrench:before{content:"\e136"}
195 | .glyphicon-tasks:before{content:"\e137"}
196 | .glyphicon-filter:before{content:"\e138"}
197 | .glyphicon-briefcase:before{content:"\e139"}
198 | .glyphicon-fullscreen:before{content:"\e140"}
199 | .glyphicon-dashboard:before{content:"\e141"}
200 | .glyphicon-paperclip:before{content:"\e142"}
201 | .glyphicon-heart-empty:before{content:"\e143"}
202 | .glyphicon-link:before{content:"\e144"}
203 | .glyphicon-phone:before{content:"\e145"}
204 | .glyphicon-pushpin:before{content:"\e146"}
205 | .glyphicon-usd:before{content:"\e148"}
206 | .glyphicon-gbp:before{content:"\e149"}
207 | .glyphicon-sort:before{content:"\e150"}
208 | .glyphicon-sort-by-alphabet:before{content:"\e151"}
209 | .glyphicon-sort-by-alphabet-alt:before{content:"\e152"}
210 | .glyphicon-sort-by-order:before{content:"\e153"}
211 | .glyphicon-sort-by-order-alt:before{content:"\e154"}
212 | .glyphicon-sort-by-attributes:before{content:"\e155"}
213 | .glyphicon-sort-by-attributes-alt:before{content:"\e156"}
214 | .glyphicon-unchecked:before{content:"\e157"}
215 | .glyphicon-expand:before{content:"\e158"}
216 | .glyphicon-collapse-down:before{content:"\e159"}
217 | .glyphicon-collapse-up:before{content:"\e160"}
218 | .glyphicon-log-in:before{content:"\e161"}
219 | .glyphicon-flash:before{content:"\e162"}
220 | .glyphicon-log-out:before{content:"\e163"}
221 | .glyphicon-new-window:before{content:"\e164"}
222 | .glyphicon-record:before{content:"\e165"}
223 | .glyphicon-save:before{content:"\e166"}
224 | .glyphicon-open:before{content:"\e167"}
225 | .glyphicon-saved:before{content:"\e168"}
226 | .glyphicon-import:before{content:"\e169"}
227 | .glyphicon-export:before{content:"\e170"}
228 | .glyphicon-send:before{content:"\e171"}
229 | .glyphicon-floppy-disk:before{content:"\e172"}
230 | .glyphicon-floppy-saved:before{content:"\e173"}
231 | .glyphicon-floppy-remove:before{content:"\e174"}
232 | .glyphicon-floppy-save:before{content:"\e175"}
233 | .glyphicon-floppy-open:before{content:"\e176"}
234 | .glyphicon-credit-card:before{content:"\e177"}
235 | .glyphicon-transfer:before{content:"\e178"}
236 | .glyphicon-cutlery:before{content:"\e179"}
237 | .glyphicon-header:before{content:"\e180"}
238 | .glyphicon-compressed:before{content:"\e181"}
239 | .glyphicon-earphone:before{content:"\e182"}
240 | .glyphicon-phone-alt:before{content:"\e183"}
241 | .glyphicon-tower:before{content:"\e184"}
242 | .glyphicon-stats:before{content:"\e185"}
243 | .glyphicon-sd-video:before{content:"\e186"}
244 | .glyphicon-hd-video:before{content:"\e187"}
245 | .glyphicon-subtitles:before{content:"\e188"}
246 | .glyphicon-sound-stereo:before{content:"\e189"}
247 | .glyphicon-sound-dolby:before{content:"\e190"}
248 | .glyphicon-sound-5-1:before{content:"\e191"}
249 | .glyphicon-sound-6-1:before{content:"\e192"}
250 | .glyphicon-sound-7-1:before{content:"\e193"}
251 | .glyphicon-copyright-mark:before{content:"\e194"}
252 | .glyphicon-registration-mark:before{content:"\e195"}
253 | .glyphicon-cloud-download:before{content:"\e197"}
254 | .glyphicon-cloud-upload:before{content:"\e198"}
255 | .glyphicon-tree-conifer:before{content:"\e199"}
256 | .glyphicon-tree-deciduous:before{content:"\e200"}
257 | .glyphicon-cd:before{content:"\e201"}
258 | .glyphicon-save-file:before{content:"\e202"}
259 | .glyphicon-open-file:before{content:"\e203"}
260 | .glyphicon-level-up:before{content:"\e204"}
261 | .glyphicon-copy:before{content:"\e205"}
262 | .glyphicon-paste:before{content:"\e206"}
263 | .glyphicon-alert:before{content:"\e209"}
264 | .glyphicon-equalizer:before{content:"\e210"}
265 | .glyphicon-king:before{content:"\e211"}
266 | .glyphicon-queen:before{content:"\e212"}
267 | .glyphicon-pawn:before{content:"\e213"}
268 | .glyphicon-bishop:before{content:"\e214"}
269 | .glyphicon-knight:before{content:"\e215"}
270 | .glyphicon-baby-formula:before{content:"\e216"}
271 | .glyphicon-tent:before{content:"\26fa"}
272 | .glyphicon-blackboard:before{content:"\e218"}
273 | .glyphicon-bed:before{content:"\e219"}
274 | .glyphicon-apple:before{content:"\f8ff"}
275 | .glyphicon-erase:before{content:"\e221"}
276 | .glyphicon-hourglass:before{content:"\231b"}
277 | .glyphicon-lamp:before{content:"\e223"}
278 | .glyphicon-duplicate:before{content:"\e224"}
279 | .glyphicon-piggy-bank:before{content:"\e225"}
280 | .glyphicon-scissors:before{content:"\e226"}
281 | .glyphicon-bitcoin:before,.glyphicon-btc:before,.glyphicon-xbt:before{content:"\e227"}
282 | .glyphicon-jpy:before,.glyphicon-yen:before{content:"\00a5"}
283 | .glyphicon-rub:before,.glyphicon-ruble:before{content:"\20bd"}
284 | .glyphicon-scale:before{content:"\e230"}
285 | .glyphicon-ice-lolly:before{content:"\e231"}
286 | .glyphicon-ice-lolly-tasted:before{content:"\e232"}
287 | .glyphicon-education:before{content:"\e233"}
288 | .glyphicon-option-horizontal:before{content:"\e234"}
289 | .glyphicon-option-vertical:before{content:"\e235"}
290 | .glyphicon-menu-hamburger:before{content:"\e236"}
291 | .glyphicon-modal-window:before{content:"\e237"}
292 | .glyphicon-oil:before{content:"\e238"}
293 | .glyphicon-grain:before{content:"\e239"}
294 | .glyphicon-sunglasses:before{content:"\e240"}
295 | .glyphicon-text-size:before{content:"\e241"}
296 | .glyphicon-text-color:before{content:"\e242"}
297 | .glyphicon-text-background:before{content:"\e243"}
298 | .glyphicon-object-align-top:before{content:"\e244"}
299 | .glyphicon-object-align-bottom:before{content:"\e245"}
300 | .glyphicon-object-align-horizontal:before{content:"\e246"}
301 | .glyphicon-object-align-left:before{content:"\e247"}
302 | .glyphicon-object-align-vertical:before{content:"\e248"}
303 | .glyphicon-object-align-right:before{content:"\e249"}
304 | .glyphicon-triangle-right:before{content:"\e250"}
305 | .glyphicon-triangle-left:before{content:"\e251"}
306 | .glyphicon-triangle-bottom:before{content:"\e252"}
307 | .glyphicon-triangle-top:before{content:"\e253"}
308 | .glyphicon-console:before{content:"\e254"}
309 | .glyphicon-superscript:before{content:"\e255"}
310 | .glyphicon-subscript:before{content:"\e256"}
311 | .glyphicon-menu-left:before{content:"\e257"}
312 | .glyphicon-menu-right:before{content:"\e258"}
313 | .glyphicon-menu-down:before{content:"\e259"}
314 | .glyphicon-menu-up:before{content:"\e260"}
315 | *,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}
316 | body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333}
317 | button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}
318 | a{color:#428bca;text-decoration:none}
319 | a:focus,a:hover{color:#2a6496;text-decoration:underline}
320 | a:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}
321 | .carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}
322 | .img-rounded{border-radius:6px}
323 | .img-thumbnail{padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}
324 | .img-circle{border-radius:50%}
325 | hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}
326 | .sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}
327 | .sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
328 | [role=button]{cursor:pointer}
329 | .h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}
330 | .h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}
331 | .h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}
332 | .h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}
333 | .h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}
334 | .h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}
335 | .h1,h1{font-size:36px}
336 | .h2,h2{font-size:30px}
337 | .h3,h3{font-size:24px}
338 | .h4,h4{font-size:18px}
339 | .h5,h5{font-size:14px}
340 | .h6,h6{font-size:12px}
341 | p{margin:0 0 10px}
342 | .lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}
343 | address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}
344 | dt,kbd kbd,label{font-weight:700}
345 | @media (min-width:768px){.lead{font-size:21px}
346 | }
347 | .small,small{font-size:85%}
348 | .mark,mark{background-color:#fcf8e3;padding:.2em}
349 | .list-inline,.list-unstyled{list-style:none;padding-left:0}
350 | .text-left{text-align:left}
351 | .text-right{text-align:right}
352 | .btn,.text-center{text-align:center}
353 | .text-justify{text-align:justify}
354 | .text-nowrap{white-space:nowrap}
355 | .text-lowercase{text-transform:lowercase}
356 | .text-uppercase{text-transform:uppercase}
357 | .text-capitalize{text-transform:capitalize}
358 | .text-muted{color:#777}
359 | .text-primary{color:#428bca}
360 | a.text-primary:focus,a.text-primary:hover{color:#3071a9}
361 | .text-success{color:#3c763d}
362 | a.text-success:focus,a.text-success:hover{color:#2b542c}
363 | .text-info{color:#31708f}
364 | a.text-info:focus,a.text-info:hover{color:#245269}
365 | .text-warning{color:#8a6d3b}
366 | a.text-warning:focus,a.text-warning:hover{color:#66512c}
367 | .text-danger{color:#a94442}
368 | a.text-danger:focus,a.text-danger:hover{color:#843534}
369 | .bg-primary{color:#fff;background-color:#428bca}
370 | a.bg-primary:focus,a.bg-primary:hover{background-color:#3071a9}
371 | .bg-success{background-color:#dff0d8}
372 | a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}
373 | .bg-info{background-color:#d9edf7}
374 | a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}
375 | .bg-warning{background-color:#fcf8e3}
376 | a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}
377 | .bg-danger{background-color:#f2dede}
378 | a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}
379 | pre code,table{background-color:transparent}
380 | .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}
381 | dl,ol,ul{margin-top:0}
382 | ol,ul{margin-bottom:10px}
383 | ol ol,ol ul,ul ol,ul ul{margin-bottom:0}
384 | .list-inline{margin-left:-5px}
385 | .list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}
386 | dl{margin-bottom:20px}
387 | dd{margin-left:0}
388 | @media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
389 | .dl-horizontal dd{margin-left:180px}
390 | }
391 | abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}
392 | .initialism{font-size:90%;text-transform:uppercase}
393 | blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}
394 | blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}
395 | blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}
396 | blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}
397 | .blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}
398 | caption,th{text-align:left}
399 | code,kbd{padding:2px 4px;font-size:90%}
400 | .blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}
401 | .blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}
402 | address{margin-bottom:20px;font-style:normal}
403 | code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}
404 | code{color:#c7254e;background-color:#f9f2f4;border-radius:4px}
405 | kbd{color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}
406 | kbd kbd{padding:0;font-size:100%;box-shadow:none}
407 | pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}
408 | .container,.container-fluid{margin-right:auto;margin-left:auto}
409 | pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}
410 | .container,.container-fluid{padding-left:15px;padding-right:15px}
411 | .pre-scrollable{overflow-y:scroll}
412 | @media (min-width:768px){.container{width:750px}
413 | }
414 | @media (min-width:992px){.container{width:970px}
415 | }
416 | @media (min-width:1200px){.container{width:1170px}
417 | }
418 | .row{margin-left:-15px;margin-right:-15px}
419 | .col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}
420 | .col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}
421 | .col-xs-12{width:100%}
422 | .col-xs-11{width:91.66666667%}
423 | .col-xs-10{width:83.33333333%}
424 | .col-xs-9{width:75%}
425 | .col-xs-8{width:66.66666667%}
426 | .col-xs-7{width:58.33333333%}
427 | .col-xs-6{width:50%}
428 | .col-xs-5{width:41.66666667%}
429 | .col-xs-4{width:33.33333333%}
430 | .col-xs-3{width:25%}
431 | .col-xs-2{width:16.66666667%}
432 | .col-xs-1{width:8.33333333%}
433 | .col-xs-pull-12{right:100%}
434 | .col-xs-pull-11{right:91.66666667%}
435 | .col-xs-pull-10{right:83.33333333%}
436 | .col-xs-pull-9{right:75%}
437 | .col-xs-pull-8{right:66.66666667%}
438 | .col-xs-pull-7{right:58.33333333%}
439 | .col-xs-pull-6{right:50%}
440 | .col-xs-pull-5{right:41.66666667%}
441 | .col-xs-pull-4{right:33.33333333%}
442 | .col-xs-pull-3{right:25%}
443 | .col-xs-pull-2{right:16.66666667%}
444 | .col-xs-pull-1{right:8.33333333%}
445 | .col-xs-pull-0{right:auto}
446 | .col-xs-push-12{left:100%}
447 | .col-xs-push-11{left:91.66666667%}
448 | .col-xs-push-10{left:83.33333333%}
449 | .col-xs-push-9{left:75%}
450 | .col-xs-push-8{left:66.66666667%}
451 | .col-xs-push-7{left:58.33333333%}
452 | .col-xs-push-6{left:50%}
453 | .col-xs-push-5{left:41.66666667%}
454 | .col-xs-push-4{left:33.33333333%}
455 | .col-xs-push-3{left:25%}
456 | .col-xs-push-2{left:16.66666667%}
457 | .col-xs-push-1{left:8.33333333%}
458 | .col-xs-push-0{left:auto}
459 | .col-xs-offset-12{margin-left:100%}
460 | .col-xs-offset-11{margin-left:91.66666667%}
461 | .col-xs-offset-10{margin-left:83.33333333%}
462 | .col-xs-offset-9{margin-left:75%}
463 | .col-xs-offset-8{margin-left:66.66666667%}
464 | .col-xs-offset-7{margin-left:58.33333333%}
465 | .col-xs-offset-6{margin-left:50%}
466 | .col-xs-offset-5{margin-left:41.66666667%}
467 | .col-xs-offset-4{margin-left:33.33333333%}
468 | .col-xs-offset-3{margin-left:25%}
469 | .col-xs-offset-2{margin-left:16.66666667%}
470 | .col-xs-offset-1{margin-left:8.33333333%}
471 | .col-xs-offset-0{margin-left:0}
472 | @media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}
473 | .col-sm-12{width:100%}
474 | .col-sm-11{width:91.66666667%}
475 | .col-sm-10{width:83.33333333%}
476 | .col-sm-9{width:75%}
477 | .col-sm-8{width:66.66666667%}
478 | .col-sm-7{width:58.33333333%}
479 | .col-sm-6{width:50%}
480 | .col-sm-5{width:41.66666667%}
481 | .col-sm-4{width:33.33333333%}
482 | .col-sm-3{width:25%}
483 | .col-sm-2{width:16.66666667%}
484 | .col-sm-1{width:8.33333333%}
485 | .col-sm-pull-12{right:100%}
486 | .col-sm-pull-11{right:91.66666667%}
487 | .col-sm-pull-10{right:83.33333333%}
488 | .col-sm-pull-9{right:75%}
489 | .col-sm-pull-8{right:66.66666667%}
490 | .col-sm-pull-7{right:58.33333333%}
491 | .col-sm-pull-6{right:50%}
492 | .col-sm-pull-5{right:41.66666667%}
493 | .col-sm-pull-4{right:33.33333333%}
494 | .col-sm-pull-3{right:25%}
495 | .col-sm-pull-2{right:16.66666667%}
496 | .col-sm-pull-1{right:8.33333333%}
497 | .col-sm-pull-0{right:auto}
498 | .col-sm-push-12{left:100%}
499 | .col-sm-push-11{left:91.66666667%}
500 | .col-sm-push-10{left:83.33333333%}
501 | .col-sm-push-9{left:75%}
502 | .col-sm-push-8{left:66.66666667%}
503 | .col-sm-push-7{left:58.33333333%}
504 | .col-sm-push-6{left:50%}
505 | .col-sm-push-5{left:41.66666667%}
506 | .col-sm-push-4{left:33.33333333%}
507 | .col-sm-push-3{left:25%}
508 | .col-sm-push-2{left:16.66666667%}
509 | .col-sm-push-1{left:8.33333333%}
510 | .col-sm-push-0{left:auto}
511 | .col-sm-offset-12{margin-left:100%}
512 | .col-sm-offset-11{margin-left:91.66666667%}
513 | .col-sm-offset-10{margin-left:83.33333333%}
514 | .col-sm-offset-9{margin-left:75%}
515 | .col-sm-offset-8{margin-left:66.66666667%}
516 | .col-sm-offset-7{margin-left:58.33333333%}
517 | .col-sm-offset-6{margin-left:50%}
518 | .col-sm-offset-5{margin-left:41.66666667%}
519 | .col-sm-offset-4{margin-left:33.33333333%}
520 | .col-sm-offset-3{margin-left:25%}
521 | .col-sm-offset-2{margin-left:16.66666667%}
522 | .col-sm-offset-1{margin-left:8.33333333%}
523 | .col-sm-offset-0{margin-left:0}
524 | }
525 | @media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}
526 | .col-md-12{width:100%}
527 | .col-md-11{width:91.66666667%}
528 | .col-md-10{width:83.33333333%}
529 | .col-md-9{width:75%}
530 | .col-md-8{width:66.66666667%}
531 | .col-md-7{width:58.33333333%}
532 | .col-md-6{width:50%}
533 | .col-md-5{width:41.66666667%}
534 | .col-md-4{width:33.33333333%}
535 | .col-md-3{width:25%}
536 | .col-md-2{width:16.66666667%}
537 | .col-md-1{width:8.33333333%}
538 | .col-md-pull-12{right:100%}
539 | .col-md-pull-11{right:91.66666667%}
540 | .col-md-pull-10{right:83.33333333%}
541 | .col-md-pull-9{right:75%}
542 | .col-md-pull-8{right:66.66666667%}
543 | .col-md-pull-7{right:58.33333333%}
544 | .col-md-pull-6{right:50%}
545 | .col-md-pull-5{right:41.66666667%}
546 | .col-md-pull-4{right:33.33333333%}
547 | .col-md-pull-3{right:25%}
548 | .col-md-pull-2{right:16.66666667%}
549 | .col-md-pull-1{right:8.33333333%}
550 | .col-md-pull-0{right:auto}
551 | .col-md-push-12{left:100%}
552 | .col-md-push-11{left:91.66666667%}
553 | .col-md-push-10{left:83.33333333%}
554 | .col-md-push-9{left:75%}
555 | .col-md-push-8{left:66.66666667%}
556 | .col-md-push-7{left:58.33333333%}
557 | .col-md-push-6{left:50%}
558 | .col-md-push-5{left:41.66666667%}
559 | .col-md-push-4{left:33.33333333%}
560 | .col-md-push-3{left:25%}
561 | .col-md-push-2{left:16.66666667%}
562 | .col-md-push-1{left:8.33333333%}
563 | .col-md-push-0{left:auto}
564 | .col-md-offset-12{margin-left:100%}
565 | .col-md-offset-11{margin-left:91.66666667%}
566 | .col-md-offset-10{margin-left:83.33333333%}
567 | .col-md-offset-9{margin-left:75%}
568 | .col-md-offset-8{margin-left:66.66666667%}
569 | .col-md-offset-7{margin-left:58.33333333%}
570 | .col-md-offset-6{margin-left:50%}
571 | .col-md-offset-5{margin-left:41.66666667%}
572 | .col-md-offset-4{margin-left:33.33333333%}
573 | .col-md-offset-3{margin-left:25%}
574 | .col-md-offset-2{margin-left:16.66666667%}
575 | .col-md-offset-1{margin-left:8.33333333%}
576 | .col-md-offset-0{margin-left:0}
577 | }
578 | @media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}
579 | .col-lg-12{width:100%}
580 | .col-lg-11{width:91.66666667%}
581 | .col-lg-10{width:83.33333333%}
582 | .col-lg-9{width:75%}
583 | .col-lg-8{width:66.66666667%}
584 | .col-lg-7{width:58.33333333%}
585 | .col-lg-6{width:50%}
586 | .col-lg-5{width:41.66666667%}
587 | .col-lg-4{width:33.33333333%}
588 | .col-lg-3{width:25%}
589 | .col-lg-2{width:16.66666667%}
590 | .col-lg-1{width:8.33333333%}
591 | .col-lg-pull-12{right:100%}
592 | .col-lg-pull-11{right:91.66666667%}
593 | .col-lg-pull-10{right:83.33333333%}
594 | .col-lg-pull-9{right:75%}
595 | .col-lg-pull-8{right:66.66666667%}
596 | .col-lg-pull-7{right:58.33333333%}
597 | .col-lg-pull-6{right:50%}
598 | .col-lg-pull-5{right:41.66666667%}
599 | .col-lg-pull-4{right:33.33333333%}
600 | .col-lg-pull-3{right:25%}
601 | .col-lg-pull-2{right:16.66666667%}
602 | .col-lg-pull-1{right:8.33333333%}
603 | .col-lg-pull-0{right:auto}
604 | .col-lg-push-12{left:100%}
605 | .col-lg-push-11{left:91.66666667%}
606 | .col-lg-push-10{left:83.33333333%}
607 | .col-lg-push-9{left:75%}
608 | .col-lg-push-8{left:66.66666667%}
609 | .col-lg-push-7{left:58.33333333%}
610 | .col-lg-push-6{left:50%}
611 | .col-lg-push-5{left:41.66666667%}
612 | .col-lg-push-4{left:33.33333333%}
613 | .col-lg-push-3{left:25%}
614 | .col-lg-push-2{left:16.66666667%}
615 | .col-lg-push-1{left:8.33333333%}
616 | .col-lg-push-0{left:auto}
617 | .col-lg-offset-12{margin-left:100%}
618 | .col-lg-offset-11{margin-left:91.66666667%}
619 | .col-lg-offset-10{margin-left:83.33333333%}
620 | .col-lg-offset-9{margin-left:75%}
621 | .col-lg-offset-8{margin-left:66.66666667%}
622 | .col-lg-offset-7{margin-left:58.33333333%}
623 | .col-lg-offset-6{margin-left:50%}
624 | .col-lg-offset-5{margin-left:41.66666667%}
625 | .col-lg-offset-4{margin-left:33.33333333%}
626 | .col-lg-offset-3{margin-left:25%}
627 | .col-lg-offset-2{margin-left:16.66666667%}
628 | .col-lg-offset-1{margin-left:8.33333333%}
629 | .col-lg-offset-0{margin-left:0}
630 | }
631 | caption{padding-top:8px;padding-bottom:8px;color:#777}
632 | .table{width:100%;max-width:100%;margin-bottom:20px}
633 | .table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}
634 | .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}
635 | .table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}
636 | .table>tbody+tbody{border-top:2px solid #ddd}
637 | .table .table{background-color:#fff}
638 | .table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}
639 | .table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}
640 | .table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}
641 | .table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}
642 | .table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}
643 | table col[class*=col-]{position:static;float:none;display:table-column}
644 | table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}
645 | .btn-group>.btn-group,.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group,.dropdown-menu{float:left}
646 | .table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}
647 | .table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}
648 | .table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}
649 | .table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}
650 | .table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}
651 | .table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}
652 | .table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}
653 | .table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}
654 | .table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}
655 | .table-responsive{overflow-x:auto;min-height:.01%}
656 | @media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}
657 | .table-responsive>.table{margin-bottom:0}
658 | .table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}
659 | .table-responsive>.table-bordered{border:0}
660 | .table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}
661 | .table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}
662 | .table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}
663 | }
664 | fieldset,legend{padding:0;border:0}
665 | fieldset{margin:0;min-width:0}
666 | legend{display:block;width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border-bottom:1px solid #e5e5e5}
667 | label{display:inline-block;max-width:100%;margin-bottom:5px}
668 | input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none}
669 | input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}
670 | .form-control,output{display:block;font-size:14px;line-height:1.42857143;color:#555}
671 | input[type=file]{display:block}
672 | input[type=range]{display:block;width:100%}
673 | select[multiple],select[size]{height:auto}
674 | input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}
675 | output{padding-top:7px}
676 | .form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}
677 | .form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}
678 | .form-control::-moz-placeholder{color:#999;opacity:1}
679 | .form-control:-ms-input-placeholder{color:#999}
680 | .form-control::-webkit-input-placeholder{color:#999}
681 | .has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}
682 | .form-control::-ms-expand{border:0;background-color:transparent}
683 | .form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}
684 | .form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}
685 | textarea.form-control{height:auto}
686 | @media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}
687 | .input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}
688 | .input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}
689 | }
690 | .form-group{margin-bottom:15px}
691 | .checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}
692 | .checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}
693 | .checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px\9}
694 | .checkbox+.checkbox,.radio+.radio{margin-top:-5px}
695 | .checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}
696 | .checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}
697 | .checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}
698 | .form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}
699 | .form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}
700 | .form-group-sm .form-control,.input-sm{font-size:12px;padding:5px 10px;border-radius:3px}
701 | .input-sm{height:30px;line-height:1.5}
702 | select.input-sm{height:30px;line-height:30px}
703 | select[multiple].input-sm,textarea.input-sm{height:auto}
704 | .form-group-sm .form-control{height:30px;line-height:1.5}
705 | .form-group-sm select.form-control{height:30px;line-height:30px}
706 | .form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}
707 | .form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}
708 | .form-group-lg .form-control,.input-lg{font-size:18px;padding:10px 16px;border-radius:6px}
709 | .input-lg{height:46px;line-height:1.3333333}
710 | select.input-lg{height:46px;line-height:46px}
711 | select[multiple].input-lg,textarea.input-lg{height:auto}
712 | .form-group-lg .form-control{height:46px;line-height:1.3333333}
713 | .form-group-lg select.form-control{height:46px;line-height:46px}
714 | .form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}
715 | .form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}
716 | .has-feedback{position:relative}
717 | .has-feedback .form-control{padding-right:42.5px}
718 | .form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}
719 | .collapsing,.dropdown,.dropup{position:relative}
720 | .form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}
721 | .form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}
722 | .has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}
723 | .has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}
724 | .has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}
725 | .has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}
726 | .has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}
727 | .has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}
728 | .has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}
729 | .has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}
730 | .has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}
731 | .has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}
732 | .has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}
733 | .has-feedback label~.form-control-feedback{top:25px}
734 | .has-feedback label.sr-only~.form-control-feedback{top:0}
735 | .help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}
736 | @media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}
737 | .form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}
738 | .form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}
739 | .form-inline .input-group{display:inline-table;vertical-align:middle}
740 | .form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}
741 | .form-inline .input-group>.form-control{width:100%}
742 | .form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}
743 | .form-inline .checkbox label,.form-inline .radio label{padding-left:0}
744 | .form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}
745 | .form-inline .has-feedback .form-control-feedback{top:0}
746 | }
747 | .form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}
748 | .form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}
749 | .form-horizontal .form-group{margin-left:-15px;margin-right:-15px}
750 | .form-horizontal .has-feedback .form-control-feedback{right:15px}
751 | @media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}
752 | .form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}
753 | .form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}
754 | }
755 | .btn{display:inline-block;margin-bottom:0;font-weight:400;vertical-align:middle;touch-action:manipulation;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
756 | .btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}
757 | .btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}
758 | .btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
759 | .btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}
760 | a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}
761 | .btn-default{color:#333;background-color:#fff;border-color:#ccc}
762 | .btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}
763 | .btn-default.active,.btn-default:active,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}
764 | .btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}
765 | .btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}
766 | .btn-default .badge{color:#fff;background-color:#333}
767 | .btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}
768 | .btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#3071a9;border-color:#193c5a}
769 | .btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}
770 | .btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#285e8e;border-color:#193c5a}
771 | .btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}
772 | .btn-primary .badge{color:#428bca;background-color:#fff}
773 | .btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}
774 | .btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}
775 | .btn-success.active,.btn-success:active,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}
776 | .btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}
777 | .btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}
778 | .btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}
779 | .btn-success .badge{color:#5cb85c;background-color:#fff}
780 | .btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}
781 | .btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}
782 | .btn-info.active,.btn-info:active,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}
783 | .btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}
784 | .btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}
785 | .btn-info .badge{color:#5bc0de;background-color:#fff}
786 | .btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}
787 | .btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}
788 | .btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}
789 | .btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}
790 | .btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}
791 | .btn-warning .badge{color:#f0ad4e;background-color:#fff}
792 | .btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}
793 | .btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}
794 | .btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}
795 | .btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}
796 | .btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}
797 | .btn-danger .badge{color:#d9534f;background-color:#fff}
798 | .btn-link{color:#428bca;font-weight:400;border-radius:0}
799 | .btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}
800 | .btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}
801 | .btn-link:focus,.btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}
802 | .btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}
803 | .btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}
804 | .btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}
805 | .btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}
806 | .btn-block{display:block;width:100%}
807 | .btn-block+.btn-block{margin-top:5px}
808 | input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}
809 | .fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}
810 | .fade.in{opacity:1}
811 | .collapse{display:none}
812 | .collapse.in{display:block}
813 | tr.collapse.in{display:table-row}
814 | tbody.collapse.in{display:table-row-group}
815 | .collapsing{height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}
816 | .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}
817 | .dropdown-toggle:focus{outline:0}
818 | .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}
819 | .btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}
820 | .btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}
821 | .btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}
822 | .dropdown-header,.dropdown-menu>li>a{white-space:nowrap;padding:3px 20px;line-height:1.42857143}
823 | .dropdown-menu-right,.dropdown-menu.pull-right{left:auto;right:0}
824 | .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}
825 | .dropdown-menu>li>a{display:block;clear:both;font-weight:400;color:#333}
826 | .dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#262626;background-color:#f5f5f5}
827 | .dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#428bca}
828 | .dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}
829 | .dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}
830 | .open>.dropdown-menu{display:block}
831 | .open>a{outline:0}
832 | .dropdown-menu-left{left:0;right:auto}
833 | .dropdown-header{display:block;font-size:12px;color:#777}
834 | .dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}
835 | .nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{left:auto;top:auto}
836 | .pull-right>.dropdown-menu{right:0;left:auto}
837 | .dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9;content:""}
838 | .dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}
839 | @media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}
840 | .navbar-right .dropdown-menu-left{left:0;right:auto}
841 | }
842 | .btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}
843 | .btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}
844 | .btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}
845 | .btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}
846 | .btn-toolbar{margin-left:-5px}
847 | .btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}
848 | .btn .caret,.btn-group>.btn:first-child{margin-left:0}
849 | .btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}
850 | .btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}
851 | .btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}
852 | .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
853 | .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}
854 | .btn-lg .caret{border-width:5px 5px 0}
855 | .dropup .btn-lg .caret{border-width:0 5px 5px}
856 | .btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}
857 | .media-object.img-thumbnail,.nav>li>a>img{max-width:none}
858 | .btn-group-vertical>.btn-group>.btn{float:none}
859 | .btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}
860 | .btn-group-vertical>.btn:first-child:not(:last-child){border-radius:4px 4px 0 0}
861 | .btn-group-vertical>.btn:last-child:not(:first-child){border-radius:0 0 4px 4px}
862 | .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}
863 | .btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}
864 | .btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}
865 | .btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}
866 | .btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}
867 | .btn-group-justified>.btn-group .btn{width:100%}
868 | .btn-group-justified>.btn-group .dropdown-menu{left:auto}
869 | [data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}
870 | .input-group{position:relative;display:table;border-collapse:separate}
871 | .input-group[class*=col-]{float:none;padding-left:0;padding-right:0}
872 | .input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}
873 | .input-group .form-control:focus{z-index:3}
874 | .input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}
875 | select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}
876 | select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}
877 | .input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}
878 | select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}
879 | select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}
880 | .input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}
881 | .nav>li,.nav>li>a{position:relative;display:block}
882 | .input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}
883 | .input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}
884 | .input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}
885 | .input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}
886 | .input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}
887 | .input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}
888 | .input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}
889 | .input-group-addon:first-child{border-right:0}
890 | .input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}
891 | .input-group-addon:last-child{border-left:0}
892 | .input-group-btn{position:relative;font-size:0;white-space:nowrap}
893 | .input-group-btn>.btn{position:relative}
894 | .input-group-btn>.btn+.btn{margin-left:-1px}
895 | .input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}
896 | .input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}
897 | .input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}
898 | .nav{margin-bottom:0;padding-left:0;list-style:none}
899 | .nav>li>a{padding:10px 15px}
900 | .nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}
901 | .nav>li.disabled>a{color:#777}
902 | .nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}
903 | .nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#428bca}
904 | .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}
905 | .nav-tabs{border-bottom:1px solid #ddd}
906 | .nav-tabs>li{float:left;margin-bottom:-1px}
907 | .nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}
908 | .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}
909 | .nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}
910 | .nav-tabs.nav-justified{width:100%;border-bottom:0}
911 | .nav-tabs.nav-justified>li{float:none}
912 | .nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px;margin-right:0;border-radius:4px}
913 | .nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}
914 | @media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}
915 | .nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}
916 | .nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}
917 | }
918 | .nav-pills>li{float:left}
919 | .nav-justified>li,.nav-stacked>li{float:none}
920 | .nav-pills>li>a{border-radius:4px}
921 | .nav-pills>li+li{margin-left:2px}
922 | .nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}
923 | .nav-stacked>li+li{margin-top:2px;margin-left:0}
924 | .nav-justified{width:100%}
925 | .nav-justified>li>a{text-align:center;margin-bottom:5px}
926 | .nav-tabs-justified{border-bottom:0}
927 | .nav-tabs-justified>li>a{margin-right:0;border-radius:4px}
928 | .nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}
929 | @media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}
930 | .nav-justified>li>a{margin-bottom:0}
931 | .nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}
932 | .nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}
933 | }
934 | .tab-content>.tab-pane{display:none}
935 | .tab-content>.active{display:block}
936 | .nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}
937 | .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}
938 | .navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}
939 | .navbar-collapse.in{overflow-y:auto}
940 | @media (min-width:768px){.navbar{border-radius:4px}
941 | .navbar-header{float:left}
942 | .navbar-collapse{width:auto;border-top:0;box-shadow:none}
943 | .navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}
944 | .navbar-collapse.in{overflow-y:visible}
945 | .navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0}
946 | }
947 | .carousel-inner,.embed-responsive,.modal,.modal-open,.progress{overflow:hidden}
948 | @media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}
949 | }
950 | .container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}
951 | .navbar-static-top{z-index:1000;border-width:0 0 1px}
952 | .navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}
953 | .navbar-fixed-top{top:0;border-width:0 0 1px}
954 | .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}
955 | .navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}
956 | .navbar-brand:focus,.navbar-brand:hover{text-decoration:none}
957 | .navbar-brand>img{display:block}
958 | @media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}
959 | .navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}
960 | .navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}
961 | }
962 | .navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}
963 | .navbar-toggle:focus{outline:0}
964 | .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}
965 | .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}
966 | .navbar-nav{margin:7.5px -15px}
967 | .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}
968 | @media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}
969 | .navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}
970 | .navbar-nav .open .dropdown-menu>li>a{line-height:20px}
971 | .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}
972 | }
973 | .progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-danger,.progress-striped .progress-bar-info,.progress-striped .progress-bar-success,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}
974 | @media (min-width:768px){.navbar-toggle{display:none}
975 | .navbar-nav{float:left;margin:0}
976 | .navbar-nav>li{float:left}
977 | .navbar-nav>li>a{padding-top:15px;padding-bottom:15px}
978 | }
979 | .navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px}
980 | @media (min-width:768px){.navbar-form .form-control-static,.navbar-form .form-group{display:inline-block}
981 | .navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}
982 | .navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}
983 | .navbar-form .input-group{display:inline-table;vertical-align:middle}
984 | .navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}
985 | .navbar-form .input-group>.form-control{width:100%}
986 | .navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}
987 | .navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}
988 | .navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}
989 | .navbar-form .has-feedback .form-control-feedback{top:0}
990 | }
991 | .btn .badge,.btn .label{position:relative;top:-1px}
992 | .breadcrumb>li,.pagination{display:inline-block}
993 | @media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}
994 | .navbar-form .form-group:last-child{margin-bottom:0}
995 | }
996 | @media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}
997 | }
998 | .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}
999 | .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-radius:4px 4px 0 0}
1000 | .navbar-btn{margin-top:8px;margin-bottom:8px}
1001 | .navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}
1002 | .navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}
1003 | .navbar-text{margin-top:15px;margin-bottom:15px}
1004 | @media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}
1005 | .navbar-left{float:left!important}
1006 | .navbar-right{float:right!important;margin-right:-15px}
1007 | .navbar-right~.navbar-right{margin-right:0}
1008 | }
1009 | .navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}
1010 | .navbar-default .navbar-brand{color:#777}
1011 | .navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}
1012 | .navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}
1013 | .navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}
1014 | .navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}
1015 | .navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}
1016 | .navbar-default .navbar-toggle{border-color:#ddd}
1017 | .navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}
1018 | .navbar-default .navbar-toggle .icon-bar{background-color:#888}
1019 | .navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}
1020 | .navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:#e7e7e7;color:#555}
1021 | @media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}
1022 | .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}
1023 | .navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}
1024 | .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}
1025 | }
1026 | .navbar-default .navbar-link{color:#777}
1027 | .navbar-default .navbar-link:hover{color:#333}
1028 | .navbar-default .btn-link{color:#777}
1029 | .navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}
1030 | .navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}
1031 | .navbar-inverse{background-color:#222;border-color:#080808}
1032 | .navbar-inverse .navbar-brand{color:#9d9d9d}
1033 | .navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}
1034 | .navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}
1035 | .navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}
1036 | .navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}
1037 | .navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}
1038 | .navbar-inverse .navbar-toggle{border-color:#333}
1039 | .navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}
1040 | .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}
1041 | .navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}
1042 | .navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#080808;color:#fff}
1043 | @media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}
1044 | .navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}
1045 | .navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}
1046 | .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}
1047 | .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}
1048 | .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}
1049 | }
1050 | .navbar-inverse .navbar-link{color:#9d9d9d}
1051 | .navbar-inverse .navbar-link:hover{color:#fff}
1052 | .navbar-inverse .btn-link{color:#9d9d9d}
1053 | .navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}
1054 | .navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}
1055 | .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}
1056 | .breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}
1057 | .breadcrumb>.active{color:#777}
1058 | .pagination{padding-left:0;margin:20px 0;border-radius:4px}
1059 | .pager li,.pagination>li{display:inline}
1060 | .pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}
1061 | .pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}
1062 | .pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}
1063 | .pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#2a6496;background-color:#eee;border-color:#ddd}
1064 | .pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}
1065 | .pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}
1066 | .pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}
1067 | .pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}
1068 | .pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}
1069 | .pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}
1070 | .badge,.label{text-align:center;font-weight:700;line-height:1;white-space:nowrap}
1071 | .pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}
1072 | .pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}
1073 | .pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}
1074 | .pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}
1075 | .pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}
1076 | .pager .next>a,.pager .next>span{float:right}
1077 | .pager .previous>a,.pager .previous>span{float:left}
1078 | .pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}
1079 | .label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;border-radius:.25em}
1080 | a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}
1081 | .label:empty{display:none}
1082 | .label-default{background-color:#777}
1083 | .label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}
1084 | .label-primary{background-color:#428bca}
1085 | .label-primary[href]:focus,.label-primary[href]:hover{background-color:#3071a9}
1086 | .label-success{background-color:#5cb85c}
1087 | .label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}
1088 | .label-info{background-color:#5bc0de}
1089 | .label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}
1090 | .label-warning{background-color:#f0ad4e}
1091 | .label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}
1092 | .label-danger{background-color:#d9534f}
1093 | .label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}
1094 | .badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;color:#fff;vertical-align:middle;background-color:#777;border-radius:10px}
1095 | .badge:empty{display:none}
1096 | .media-object,.thumbnail{display:block}
1097 | .btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}
1098 | a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}
1099 | .list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}
1100 | .jumbotron,.jumbotron .h1,.jumbotron h1{color:inherit}
1101 | .list-group-item>.badge{float:right}
1102 | .list-group-item>.badge+.badge{margin-right:5px}
1103 | .nav-pills>li>a>.badge{margin-left:3px}
1104 | .jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;background-color:#eee}
1105 | .jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}
1106 | .alert .alert-link,.close{font-weight:700}
1107 | .alert,.thumbnail{margin-bottom:20px}
1108 | .jumbotron>hr{border-top-color:#d5d5d5}
1109 | .container .jumbotron,.container-fluid .jumbotron{border-radius:6px;padding-left:15px;padding-right:15px}
1110 | .jumbotron .container{max-width:100%}
1111 | @media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}
1112 | .container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}
1113 | .jumbotron .h1,.jumbotron h1{font-size:63px}
1114 | }
1115 | .thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}
1116 | .thumbnail a>img,.thumbnail>img{margin-left:auto;margin-right:auto}
1117 | a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#428bca}
1118 | .thumbnail .caption{padding:9px;color:#333}
1119 | .alert{padding:15px;border:1px solid transparent;border-radius:4px}
1120 | .alert h4{margin-top:0;color:inherit}
1121 | .alert>p,.alert>ul{margin-bottom:0}
1122 | .alert>p+p{margin-top:5px}
1123 | .alert-dismissable,.alert-dismissible{padding-right:35px}
1124 | .alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}
1125 | .modal,.modal-backdrop{right:0;bottom:0;left:0}
1126 | .alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}
1127 | .alert-success hr{border-top-color:#c9e2b3}
1128 | .alert-success .alert-link{color:#2b542c}
1129 | .alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}
1130 | .alert-info hr{border-top-color:#a6e1ec}
1131 | .alert-info .alert-link{color:#245269}
1132 | .alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}
1133 | .alert-warning hr{border-top-color:#f7e1b5}
1134 | .alert-warning .alert-link{color:#66512c}
1135 | .alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}
1136 | .alert-danger hr{border-top-color:#e4b9c0}
1137 | .alert-danger .alert-link{color:#843534}
1138 | @-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}
1139 | to{background-position:0 0}
1140 | }
1141 | @keyframes progress-bar-stripes{from{background-position:40px 0}
1142 | to{background-position:0 0}
1143 | }
1144 | .progress{height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}
1145 | .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}
1146 | .progress-bar-striped,.progress-striped .progress-bar{background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}
1147 | .progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}
1148 | .progress-bar-success{background-color:#5cb85c}
1149 | .progress-striped .progress-bar-success{background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}
1150 | .progress-bar-info{background-color:#5bc0de}
1151 | .progress-striped .progress-bar-info{background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}
1152 | .progress-bar-warning{background-color:#f0ad4e}
1153 | .progress-striped .progress-bar-warning{background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}
1154 | .progress-bar-danger{background-color:#d9534f}
1155 | .progress-striped .progress-bar-danger{background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}
1156 | .media{margin-top:15px}
1157 | .media:first-child{margin-top:0}
1158 | .media,.media-body{zoom:1;overflow:hidden}
1159 | .media-body{width:10000px}
1160 | .media-right,.media>.pull-right{padding-left:10px}
1161 | .media-left,.media>.pull-left{padding-right:10px}
1162 | .media-body,.media-left,.media-right{display:table-cell;vertical-align:top}
1163 | .media-middle{vertical-align:middle}
1164 | .media-bottom{vertical-align:bottom}
1165 | .media-heading{margin-top:0;margin-bottom:5px}
1166 | .media-list{padding-left:0;list-style:none}
1167 | .list-group{margin-bottom:20px;padding-left:0}
1168 | .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}
1169 | .list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}
1170 | .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}
1171 | a.list-group-item,button.list-group-item{color:#555}
1172 | a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}
1173 | a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{text-decoration:none;color:#555;background-color:#f5f5f5}
1174 | button.list-group-item{width:100%;text-align:left}
1175 | .list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#eee;color:#777;cursor:not-allowed}
1176 | .list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}
1177 | .list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}
1178 | .list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}
1179 | .list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}
1180 | .list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#e1edf7}
1181 | .list-group-item-success{color:#3c763d;background-color:#dff0d8}
1182 | a.list-group-item-success,button.list-group-item-success{color:#3c763d}
1183 | a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}
1184 | a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}
1185 | a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}
1186 | .list-group-item-info{color:#31708f;background-color:#d9edf7}
1187 | a.list-group-item-info,button.list-group-item-info{color:#31708f}
1188 | a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}
1189 | a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}
1190 | a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}
1191 | .list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}
1192 | a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}
1193 | a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}
1194 | a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}
1195 | a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}
1196 | .list-group-item-danger{color:#a94442;background-color:#f2dede}
1197 | a.list-group-item-danger,button.list-group-item-danger{color:#a94442}
1198 | a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}
1199 | a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}
1200 | a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}
1201 | .panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}
1202 | .list-group-item-heading{margin-top:0;margin-bottom:5px}
1203 | .list-group-item-text{margin-bottom:0;line-height:1.3}
1204 | .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}
1205 | .panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}
1206 | .panel-body{padding:15px}
1207 | .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}
1208 | .panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}
1209 | .panel-title{margin-top:0;font-size:16px}
1210 | .panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}
1211 | .panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}
1212 | .panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}
1213 | .panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}
1214 | .panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}
1215 | .panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}
1216 | .panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-right-radius:3px;border-top-left-radius:3px}
1217 | .list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}
1218 | .panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}
1219 | .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}
1220 | .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}
1221 | .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}
1222 | .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}
1223 | .panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}
1224 | .panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}
1225 | .panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}
1226 | .panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}
1227 | .panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}
1228 | .panel>.table-responsive{border:0;margin-bottom:0}
1229 | .panel-group{margin-bottom:20px}
1230 | .panel-group .panel{margin-bottom:0;border-radius:4px}
1231 | .panel-group .panel+.panel{margin-top:5px}
1232 | .panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}
1233 | .panel-group .panel-footer{border-top:0}
1234 | .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}
1235 | .panel-default{border-color:#ddd}
1236 | .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}
1237 | .panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}
1238 | .panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}
1239 | .panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}
1240 | .panel-primary{border-color:#428bca}
1241 | .panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}
1242 | .panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}
1243 | .panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}
1244 | .panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}
1245 | .panel-success{border-color:#d6e9c6}
1246 | .panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}
1247 | .panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}
1248 | .panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}
1249 | .panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}
1250 | .panel-info{border-color:#bce8f1}
1251 | .panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}
1252 | .panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}
1253 | .panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}
1254 | .panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}
1255 | .panel-warning{border-color:#faebcc}
1256 | .panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}
1257 | .panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}
1258 | .panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}
1259 | .panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}
1260 | .panel-danger{border-color:#ebccd1}
1261 | .panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}
1262 | .panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}
1263 | .panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}
1264 | .panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}
1265 | .embed-responsive{position:relative;display:block;height:0;padding:0}
1266 | .embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}
1267 | .embed-responsive-16by9{padding-bottom:56.25%}
1268 | .embed-responsive-4by3{padding-bottom:75%}
1269 | .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}
1270 | .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}
1271 | .well-lg{padding:24px;border-radius:6px}
1272 | .well-sm{padding:9px;border-radius:3px}
1273 | .close{float:right;font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}
1274 | .popover,.tooltip{text-decoration:none;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal}
1275 | .close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}
1276 | button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}
1277 | .modal-content,.popover{background-clip:padding-box}
1278 | .modal{display:none;position:fixed;top:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}
1279 | .modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}
1280 | .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}
1281 | .modal-open .modal{overflow-x:hidden;overflow-y:auto}
1282 | .modal-dialog{position:relative;width:auto;margin:10px}
1283 | .modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}
1284 | .modal-backdrop{position:fixed;top:0;z-index:1040;background-color:#000}
1285 | .modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}
1286 | .modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}
1287 | .modal-header{padding:15px;border-bottom:1px solid #e5e5e5}
1288 | .tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{top:0;border-width:0 5px 5px;border-bottom-color:#000}
1289 | .modal-header .close{margin-top:-2px}
1290 | .modal-title{margin:0;line-height:1.42857143}
1291 | .modal-body{position:relative;padding:15px}
1292 | .modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}
1293 | .modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}
1294 | .modal-footer .btn-group .btn+.btn{margin-left:-1px}
1295 | .modal-footer .btn-block+.btn-block{margin-left:0}
1296 | .modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}
1297 | @media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}
1298 | .modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}
1299 | .modal-sm{width:300px}
1300 | }
1301 | .tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}
1302 | @media (min-width:992px){.modal-lg{width:900px}
1303 | }
1304 | .tooltip{position:absolute;z-index:1070;display:block;text-align:left;text-align:start;font-size:12px;opacity:0;filter:alpha(opacity=0)}
1305 | .tooltip.in{opacity:.9;filter:alpha(opacity=90)}
1306 | .tooltip.top{margin-top:-3px;padding:5px 0}
1307 | .tooltip.right{margin-left:3px;padding:0 5px}
1308 | .tooltip.bottom{margin-top:3px;padding:5px 0}
1309 | .tooltip.left{margin-left:-3px;padding:0 5px}
1310 | .tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}
1311 | .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}
1312 | .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}
1313 | .tooltip.top-left .tooltip-arrow{right:5px}
1314 | .tooltip.top-right .tooltip-arrow{left:5px}
1315 | .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}
1316 | .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}
1317 | .tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px}
1318 | .tooltip.bottom-left .tooltip-arrow{right:5px;margin-top:-5px}
1319 | .tooltip.bottom-right .tooltip-arrow{left:5px;margin-top:-5px}
1320 | .popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;text-align:start;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}
1321 | .carousel-caption,.carousel-control{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.6)}
1322 | .popover.top{margin-top:-10px}
1323 | .popover.right{margin-left:10px}
1324 | .popover.bottom{margin-top:10px}
1325 | .popover.left{margin-left:-10px}
1326 | .popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}
1327 | .popover-content{padding:9px 14px}
1328 | .popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}
1329 | .carousel,.carousel-inner{position:relative}
1330 | .popover>.arrow{border-width:11px}
1331 | .popover>.arrow:after{border-width:10px;content:""}
1332 | .popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}
1333 | .popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}
1334 | .popover.left>.arrow:after,.popover.right>.arrow:after{content:" ";bottom:-10px}
1335 | .popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}
1336 | .popover.right>.arrow:after{left:1px;border-left-width:0;border-right-color:#fff}
1337 | .popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}
1338 | .popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}
1339 | .popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}
1340 | .popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}
1341 | .carousel-inner{width:100%}
1342 | .carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}
1343 | .carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}
1344 | @media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-moz-transition:-moz-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px}
1345 | .carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}
1346 | .carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}
1347 | .carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}
1348 | }
1349 | .carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}
1350 | .carousel-inner>.active{left:0}
1351 | .carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}
1352 | .carousel-inner>.next{left:100%}
1353 | .carousel-inner>.prev{left:-100%}
1354 | .carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}
1355 | .carousel-inner>.active.left{left:-100%}
1356 | .carousel-inner>.active.right{left:100%}
1357 | .carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;text-align:center;background-color:transparent}
1358 | .carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}
1359 | .carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}
1360 | .carousel-control:focus,.carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}
1361 | .carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}
1362 | .carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}
1363 | .carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}
1364 | .carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;line-height:1;font-family:serif}
1365 | .carousel-control .icon-prev:before{content:'\2039'}
1366 | .carousel-control .icon-next:before{content:'\203a'}
1367 | .carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}
1368 | .carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000\9;background-color:transparent}
1369 | .carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}
1370 | .carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;text-align:center}
1371 | .carousel-caption .btn,.text-hide{text-shadow:none}
1372 | @media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}
1373 | .carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}
1374 | .carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}
1375 | .carousel-caption{left:20%;right:20%;padding-bottom:30px}
1376 | .carousel-indicators{bottom:20px}
1377 | }
1378 | .btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{content:" ";display:table}
1379 | .btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}
1380 | .center-block{display:block;margin-left:auto;margin-right:auto}
1381 | .pull-right{float:right!important}
1382 | .pull-left{float:left!important}
1383 | .hide{display:none!important}
1384 | .show{display:block!important}
1385 | .hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}
1386 | .invisible{visibility:hidden}
1387 | .text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}
1388 | .affix{position:fixed}
1389 | @-ms-viewport{width:device-width}
1390 | @media (max-width:767px){.visible-xs{display:block!important}
1391 | table.visible-xs{display:table!important}
1392 | tr.visible-xs{display:table-row!important}
1393 | td.visible-xs,th.visible-xs{display:table-cell!important}
1394 | .visible-xs-block{display:block!important}
1395 | .visible-xs-inline{display:inline!important}
1396 | .visible-xs-inline-block{display:inline-block!important}
1397 | }
1398 | @media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}
1399 | table.visible-sm{display:table!important}
1400 | tr.visible-sm{display:table-row!important}
1401 | td.visible-sm,th.visible-sm{display:table-cell!important}
1402 | .visible-sm-block{display:block!important}
1403 | .visible-sm-inline{display:inline!important}
1404 | .visible-sm-inline-block{display:inline-block!important}
1405 | }
1406 | @media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}
1407 | table.visible-md{display:table!important}
1408 | tr.visible-md{display:table-row!important}
1409 | td.visible-md,th.visible-md{display:table-cell!important}
1410 | .visible-md-block{display:block!important}
1411 | .visible-md-inline{display:inline!important}
1412 | .visible-md-inline-block{display:inline-block!important}
1413 | }
1414 | @media (min-width:1200px){.visible-lg{display:block!important}
1415 | table.visible-lg{display:table!important}
1416 | tr.visible-lg{display:table-row!important}
1417 | td.visible-lg,th.visible-lg{display:table-cell!important}
1418 | .visible-lg-block{display:block!important}
1419 | .visible-lg-inline{display:inline!important}
1420 | .visible-lg-inline-block{display:inline-block!important}
1421 | }
1422 | @media (max-width:767px){.hidden-xs{display:none!important}
1423 | }
1424 | @media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}
1425 | }
1426 | @media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}
1427 | }
1428 | @media (min-width:1200px){.hidden-lg{display:none!important}
1429 | }
1430 | .visible-print{display:none!important}
1431 | @media print{.visible-print{display:block!important}
1432 | table.visible-print{display:table!important}
1433 | tr.visible-print{display:table-row!important}
1434 | td.visible-print,th.visible-print{display:table-cell!important}
1435 | }
1436 | .visible-print-block{display:none!important}
1437 | @media print{.visible-print-block{display:block!important}
1438 | }
1439 | .visible-print-inline{display:none!important}
1440 | @media print{.visible-print-inline{display:inline!important}
1441 | }
1442 | .visible-print-inline-block{display:none!important}
1443 | @media print{.visible-print-inline-block{display:inline-block!important}
1444 | .hidden-print{display:none!important}
1445 | }
--------------------------------------------------------------------------------