├── requirements.txt ├── .gitignore ├── src ├── lexical │ ├── __init__.py │ ├── commom.py │ ├── lexical.py │ └── tokrules.py ├── semantic │ ├── __init__.py │ ├── scope.py │ ├── checktype.py │ ├── myexceptions.py │ └── semantic.py ├── syntactic │ ├── __init__.py │ ├── ast.py │ └── syntactic.py └── __init__.py ├── static ├── img │ └── approved.jpg └── css │ └── bootstrap.min.css ├── examples ├── hello-world.cl ├── hello.cl ├── if_example.cl ├── print-cool.cl ├── let_example.cl ├── while_example.cl ├── case_example.cl ├── inhritance_example.cl ├── hs.cl ├── new-complex.cl ├── readme.txt ├── cells.cl ├── primes.cl ├── atoi.cl ├── sort-list.cl ├── list.cl └── arith.cl ├── templates ├── index.html ├── base.html ├── syntactic.html └── lexico.html ├── compiler.py ├── README.md ├── LICENSE └── app.py /requirements.txt: -------------------------------------------------------------------------------- 1 | Flask==0.10.1 2 | ply==3.8 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | env/ 2 | *.pyc 3 | parser.out 4 | parsetab.py -------------------------------------------------------------------------------- /src/lexical/__init__.py: -------------------------------------------------------------------------------- 1 | from .lexical import MyLex 2 | -------------------------------------------------------------------------------- /src/semantic/__init__.py: -------------------------------------------------------------------------------- 1 | from .semantic import Semant 2 | -------------------------------------------------------------------------------- /src/syntactic/__init__.py: -------------------------------------------------------------------------------- 1 | from .syntactic import syntactic 2 | -------------------------------------------------------------------------------- /static/img/approved.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delete/cool-compiler/master/static/img/approved.jpg -------------------------------------------------------------------------------- /src/__init__.py: -------------------------------------------------------------------------------- 1 | from syntactic import syntactic 2 | from semantic import Semant 3 | from lexical import MyLex as lex -------------------------------------------------------------------------------- /examples/hello-world.cl: -------------------------------------------------------------------------------- 1 | class Main inherits IO { 2 | a : Int <- 1; 3 | main() : Object { 4 | { 5 | out_string("Hello, world.\n"); 6 | out_int(a); 7 | } 8 | }; 9 | }; -------------------------------------------------------------------------------- /examples/hello.cl: -------------------------------------------------------------------------------- 1 | class Main inherits IO { 2 | main() : Object { 3 | out_string("Hello \ 4 | world") 5 | a : Int; 6 | a <- 5; 7 | out_int(a); 8 | (* teste 9 | example*) 10 | } ; 11 | } ; -------------------------------------------------------------------------------- /examples/if_example.cl: -------------------------------------------------------------------------------- 1 | class Main inherits IO { 2 | c : Int <- 1; 3 | flag : Bool <- true; 4 | main() : Object { 5 | if 0 < c then 6 | true 7 | else 8 | false 9 | fi 10 | }; 11 | }; 12 | -------------------------------------------------------------------------------- /examples/print-cool.cl: -------------------------------------------------------------------------------- 1 | class Main inherits IO { 2 | main() : SELF_TYPE { 3 | { 4 | out_string((new Object).type_name().substr(4,1)). 5 | out_string((isvoid self).type_name().substr(1,3)); 6 | out_string("\n"); 7 | } 8 | }; 9 | }; 10 | -------------------------------------------------------------------------------- /src/lexical/commom.py: -------------------------------------------------------------------------------- 1 | # Compute column. 2 | # input is the input text string 3 | # token is a token instance 4 | def find_column(input, token): 5 | last_cr = input.rfind('\n', 0, token.lexpos) 6 | if last_cr < 0: 7 | # Not found 8 | last_cr = 0 9 | column = (token.lexpos - last_cr) + 1 10 | return column -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | 4 | {% block content %} 5 | 6 |
7 |

A ~cool~ web compiler

8 |

for Cool Language, written in Python using the framework PLY.

9 |

Source code

10 |
11 | 12 | {% endblock %} -------------------------------------------------------------------------------- /examples/let_example.cl: -------------------------------------------------------------------------------- 1 | class Main inherits IO { 2 | c : Int <- 1; 3 | main() : Object { 4 | { 5 | out_string("Hello, world.\n"); 6 | out_int(c); 7 | let b : Int <- 1, 8 | a : String <- "A" in 9 | { 10 | out_string(a); 11 | out_string("=="); 12 | out_int(b); 13 | }; 14 | } 15 | }; 16 | }; -------------------------------------------------------------------------------- /examples/while_example.cl: -------------------------------------------------------------------------------- 1 | class Main inherits IO { 2 | c : Int <- 1; 3 | flag : Bool <- true; 4 | main() : Object { 5 | { 6 | out_string("Hello, world.\n"); 7 | (let countdown : Int <- 20 in 8 | while flag loop 9 | { 10 | countdown <- countdown - 1; 11 | out_int(c); 12 | } 13 | pool 14 | ); 15 | } 16 | }; 17 | }; 18 | -------------------------------------------------------------------------------- /examples/case_example.cl: -------------------------------------------------------------------------------- 1 | class A {}; 2 | class B inherits A {}; 3 | class C inherits B {}; 4 | 5 | class D {}; 6 | 7 | class Main inherits IO { 8 | var : B <- (new B); 9 | 10 | class_type(var : Object) : SELF_TYPE { 11 | case var of 12 | a : A => out_string("Class type is now A\n"); 13 | b : B => out_string("Class type is now B\n"); 14 | c : C => out_string("Class type is now C\n"); 15 | o : Object => out_string("Oooops\n"); 16 | esac 17 | }; 18 | 19 | main() : Object { 20 | { 21 | class_type(var); 22 | } 23 | }; 24 | }; 25 | 26 | 27 | -------------------------------------------------------------------------------- /examples/inhritance_example.cl: -------------------------------------------------------------------------------- 1 | class A inherits IO { 2 | a : Int <- 2; 3 | hello(x: Int) : Int { 4 | { 5 | out_int(x); 6 | 0; 7 | } 8 | }; 9 | }; 10 | 11 | class B inherits A { 12 | do() : String { 13 | { 14 | hello(2); 15 | out_int(a); 16 | "do nothing"; 17 | } 18 | }; 19 | }; 20 | 21 | class Main inherits IO { 22 | i : Int <- 1; 23 | b : B <- new B; 24 | main() : Object { 25 | { 26 | out_string("Hello, world.\n"); 27 | out_int(i); 28 | b.do(); 29 | b.hello(3); 30 | } 31 | }; 32 | }; 33 | -------------------------------------------------------------------------------- /compiler.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from src import syntactic 4 | from src import Semant 5 | from src import lex 6 | 7 | DEBUG = False 8 | 9 | if __name__ == '__main__': 10 | if len(sys.argv) != 2: 11 | print('Choose a cool file to read.') 12 | sys.exit(1) 13 | 14 | with open(sys.argv[1]) as file: 15 | code = file.read() 16 | 17 | l = lex() 18 | llex, lerror = l.tokenize(code) 19 | if lerror: 20 | print('Lex - EROOR') 21 | print(lerror) 22 | sys.exit(1) 23 | 24 | ast = syntactic(code) 25 | if ast[0] is None: 26 | print("Sintatic - ERROR") 27 | sys.exit(1) 28 | 29 | if DEBUG: 30 | print('\n\n====== DEBUGGING ======\n\n') 31 | s = Semant(ast[0]) 32 | s.build() 33 | 34 | if DEBUG: 35 | print('\n\n====== CLASSES ======\n\n') 36 | print(s.classes) 37 | print('\n\n====== PARENTS ======\n\n') 38 | print(s.parents) 39 | print('\n\n====== AST ======\n\n') 40 | print(ast[0]) 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cool Language Compiler (working in progress) 2 | > Compiler for [Cool Language](http://theory.stanford.edu/~aiken/software/cool/cool.html) created for compilers' class from my Computer Science degrees at Fluminense Federal University. 3 | 4 | ![](http://i.imgur.com/ivygr2X.png) 5 | 6 | ## Installation 7 | 8 | Clone the project: 9 | 10 | ``` 11 | $ git clone https://github.com/delete/cool-compiler.git 12 | $ cd cool-compiler/ 13 | ``` 14 | 15 | Install the requirements packages: 16 | 17 | > See [here](https://pip.pypa.io/en/stable/installing/) how to install pip. 18 | 19 | `$ pip install -r requirements.txt` 20 | 21 | 22 | ## Usage example 23 | 24 | Web app: 25 | 26 | > Only lexical and syntatic analyzers are working on web app for now, if you want use semantic, please, run from terminal. 27 | 28 | `$ python2 app.py` 29 | 30 | Access: 31 | `http://127.0.0.1:5000/` 32 | 33 | Run from the terminal: 34 | 35 | `$ python2 compiler.py examples/hello-world.cl` 36 | 37 | > If no message appear, then everything is fine. 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2016 Fellipe Pinheiro 3 | 4 | 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: 5 | 6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 | 8 | 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. -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask import render_template, request 3 | 4 | from src.lexical import MyLex 5 | from src.syntactic import syntactic as syn 6 | 7 | 8 | app = Flask(__name__) 9 | 10 | 11 | @app.route("/") 12 | def index(): 13 | return render_template('index.html') 14 | 15 | 16 | @app.route("/lexico", methods=['GET', 'POST']) 17 | def lexico(): 18 | llex = () 19 | lerror = () 20 | code = '' 21 | 22 | if request.method == 'POST': 23 | code = request.form['code'] 24 | l = MyLex() 25 | llex, lerror = l.tokenize(code) 26 | 27 | return render_template( 28 | 'lexico.html', llex=llex, lerror=lerror, code=code 29 | ) 30 | 31 | 32 | @app.route("/sintatico", methods=['GET', 'POST']) 33 | def syntactic(): 34 | code = '' 35 | result = [] 36 | serror = [] 37 | 38 | if request.method == 'POST': 39 | code = request.form['code'] 40 | result, serror = syn(code) 41 | 42 | return render_template( 43 | 'syntactic.html', result=result, serror=serror, code=code 44 | ) 45 | 46 | if __name__ == "__main__": 47 | app.run(debug=True) 48 | -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 30 | 31 | 32 |
33 | {% block content %} 34 | {% endblock %} 35 |
36 | 37 | -------------------------------------------------------------------------------- /src/semantic/scope.py: -------------------------------------------------------------------------------- 1 | class Scope(): 2 | """ 3 | List of dictionaries to save name->type. 4 | This class represents a stack of environments. 5 | Each dictionary represents an environment. 6 | """ 7 | 8 | def __init__(self): 9 | self.store = [dict()] 10 | 11 | def get(self, key): 12 | for item in self.store[::-1]: 13 | if key in item: 14 | return item[key] 15 | raise KeyError(key) 16 | 17 | def add(self, key, value): 18 | self.store[-1][key] = value 19 | 20 | def remove(self, key): 21 | del self.store[-1][key] 22 | 23 | def new(self): 24 | self.store.append(dict()) 25 | 26 | def destroy(self): 27 | del self.store[-1] 28 | 29 | def exists(self, key): 30 | try: 31 | self.get(key) 32 | return True 33 | except KeyError: 34 | return False 35 | 36 | 37 | if __name__ == '__main__': 38 | scope = Scope() 39 | scope.add('Main', ('Int', 'Int')) 40 | print(scope.store) 41 | scope.remove('Main') 42 | print(scope.store) 43 | scope.new() 44 | print(scope.store) 45 | scope.destroy() 46 | print(scope.store) 47 | -------------------------------------------------------------------------------- /src/syntactic/ast.py: -------------------------------------------------------------------------------- 1 | from collections import namedtuple 2 | 3 | # Used to create abstract syntax tree 4 | Class = namedtuple("Class", "name, parent, feature_list") 5 | Attr = namedtuple("Attr", "name, type, body") 6 | Method = namedtuple( 7 | "Method", "name, formal_list, return_type, body" 8 | ) 9 | Object = namedtuple("Object", "name") 10 | Int = namedtuple("Int", "content") 11 | Bool = namedtuple("Bool", "content") 12 | Str = namedtuple("Str", "content") 13 | Block = namedtuple("Block", "body") 14 | Assign = namedtuple("Assign", "name, body") 15 | Dispatch = namedtuple("Dispatch", "body, method, expr_list") 16 | StaticDispatch = namedtuple( 17 | "StaticDispatch", "body, type, method, expr_list" 18 | ) 19 | Plus = namedtuple("Plus", "first, second") 20 | Sub = namedtuple("Sub", "first, second") 21 | Mult = namedtuple("Mult", "first, second") 22 | Div = namedtuple("Div", "first, second") 23 | Lt = namedtuple("Lt", "first, second") 24 | Le = namedtuple("Le", "first, second") 25 | Eq = namedtuple("Eq", "first, second") 26 | If = namedtuple("If", "predicate, then_body, else_body") 27 | While = namedtuple("While", "predicate, body") 28 | Case = namedtuple("Case", "expr, case_list") 29 | New = namedtuple("New", "type") 30 | Isvoid = namedtuple("Isvoid", "body") 31 | Neg = namedtuple("Neg", "body") 32 | Not = namedtuple("Not", "body") 33 | Let = namedtuple("Let", "object, type, init, body") 34 | -------------------------------------------------------------------------------- /examples/hs.cl: -------------------------------------------------------------------------------- 1 | (* hairy . . .*) 2 | 3 | class Foo inherits Bazz { 4 | a : Razz <- case self of 5 | n : Razz => (new Bar); 6 | n : Foo => (new Razz); 7 | n : Bar => n; 8 | esac; 9 | 10 | b : Int <- a.doh() + g.doh() + doh() + printh(); 11 | 12 | doh() : Int { (let i : Int <- h in { h <- h + 2; i; } ) }; 13 | 14 | }; 15 | 16 | class Bar inherits Razz { 17 | 18 | c : Int <- doh(); 19 | 20 | d : Object <- printh(); 21 | }; 22 | 23 | 24 | class Razz inherits Foo { 25 | 26 | e : Bar <- case self of 27 | n : Razz => (new Bar); 28 | n : Bar => n; 29 | esac; 30 | 31 | f : Int <- a@Bazz.doh() + g.doh() + e.doh() + doh() + printh(); 32 | 33 | }; 34 | 35 | class Bazz inherits IO { 36 | 37 | h : Int <- 1; 38 | 39 | g : Foo <- case self of 40 | n : Bazz => (new Foo); 41 | n : Razz => (new Bar); 42 | n : Foo => (new Razz); 43 | n : Bar => n; 44 | esac; 45 | 46 | i : Object <- printh(); 47 | 48 | printh() : Int { { out_int(h); 0; } }; 49 | 50 | doh() : Int { (let i: Int <- h in { h <- h + 1; i; } ) }; 51 | }; 52 | 53 | (* scary . . . *) 54 | class Main inherits IO { 55 | a : Bazz <- new Bazz; 56 | b : Foo <- new Foo; 57 | c : Razz <- new Razz; 58 | d : Bar <- new Bar; 59 | 60 | main(): String { { out_string("\n") ; "do nothing" ; } }; 61 | }; 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /src/lexical/lexical.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | import sys 3 | 4 | import ply.lex as lex 5 | 6 | from commom import find_column 7 | import tokrules 8 | 9 | 10 | class MyLex(object): 11 | 12 | def __init__(self, module=tokrules): 13 | self.module = module 14 | self.lexer = None 15 | self.llex = [] 16 | 17 | self._build_lexer() 18 | 19 | def _build_lexer(self): 20 | self.lexer = lex.lex(module=self.module) 21 | 22 | def tokenize(self, newString): 23 | self.lexer.input(str(newString)) 24 | 25 | while True: 26 | tok = self.lexer.token() 27 | if not tok: 28 | break 29 | lt = (tok.type, tok.value, tok.lineno, find_column(newString, tok)) 30 | self.llex.append(lt) 31 | 32 | return tuple(self.llex), tuple(tokrules.lerror) 33 | 34 | 35 | if __name__ == '__main__': 36 | codigo = '''class Main inherits IO { 37 | main() : Object { 38 | out_string("Hello, world.\n") 39 | -- comentario 40 | a : Int; 41 | a <- 5; 42 | out_int(2=2) 43 | }; 44 | }; 45 | ''' 46 | if len(sys.argv) != 2: 47 | print('Choose a cool file to read.') 48 | sys.exit(1) 49 | 50 | with open(sys.argv[1]) as file: 51 | codigo = file.read() 52 | l = MyLex() 53 | llex, lerror = l.tokenize(codigo) 54 | 55 | for l in llex: 56 | print(l) 57 | 58 | print('ERROR') 59 | for e in lerror: 60 | print(e) 61 | -------------------------------------------------------------------------------- /examples/new-complex.cl: -------------------------------------------------------------------------------- 1 | class Main inherits IO { 2 | main() : SELF_TYPE { 3 | (let c : Complex <- (new Complex).init(1, 1) in 4 | { 5 | -- trivially equal (see CoolAid) 6 | if c.reflect_X() = c.reflect_0() 7 | then out_string("passed\n") 8 | else out_string("failed\n") 9 | fi; 10 | -- equal 11 | if c.reflect_X().reflect_Y().equal(c.reflect_0()) 12 | then out_string("passed\n") 13 | else out_string("failed\n") 14 | fi; 15 | } 16 | ) 17 | }; 18 | }; 19 | 20 | class Complex inherits IO { 21 | x : Int; 22 | y : Int; 23 | 24 | init(a : Int, b : Int) : Complex { 25 | { 26 | x <- a; 27 | y <- b; 28 | self; 29 | } 30 | }; 31 | 32 | print() : Object { 33 | if y = 0 34 | then out_int(x) 35 | else out_int(x).out_string("+").out_int(y).out_string("I") 36 | fi 37 | }; 38 | 39 | reflect_0() : Complex { 40 | { 41 | x <- ~x; 42 | y <- ~y; 43 | self; 44 | } 45 | }; 46 | 47 | reflect_X() : Complex { 48 | { 49 | y <- ~y; 50 | self; 51 | } 52 | }; 53 | 54 | reflect_Y() : Complex { 55 | { 56 | x <- ~x; 57 | self; 58 | } 59 | }; 60 | 61 | equal(d : Complex) : Bool { 62 | if x = d.x_value() 63 | then 64 | if y = d.y_value() 65 | then true 66 | else false 67 | fi 68 | else false 69 | fi 70 | }; 71 | 72 | x_value() : Int { 73 | x 74 | }; 75 | 76 | y_value() : Int { 77 | y 78 | }; 79 | }; 80 | -------------------------------------------------------------------------------- /src/semantic/checktype.py: -------------------------------------------------------------------------------- 1 | from ..syntactic.ast import * 2 | from myexceptions import SemantError 3 | 4 | 5 | def returned_type(feature, _class): 6 | """ 7 | Returns the type of the feature. 8 | 9 | There is a difference between attribute and method. 10 | Attributes has "type" attribute and 11 | method has "return_type" attribute. 12 | """ 13 | try: 14 | # For Attribute 15 | _type = feature.type 16 | except AttributeError: 17 | # For Method 18 | _type = feature.return_type 19 | 20 | if _type == 'SELF_TYPE': 21 | _type = _class.name 22 | 23 | return _type 24 | 25 | 26 | def get_expression_type(expression, _class, scope): 27 | """ 28 | Returns the type of the expression. 29 | 30 | If the type is self, then returns the name of the 31 | class. 32 | """ 33 | if isinstance(expression, Str): 34 | return 'String' 35 | 36 | elif isinstance(expression, Object): 37 | if expression.name == "self": 38 | return _class.name 39 | 40 | if not scope.exists(expression.name): 41 | raise SemantError( 42 | "Variable %s is not in scope" % expression.name 43 | ) 44 | 45 | return scope.get(expression.name) 46 | 47 | elif isinstance(expression, Int): 48 | return "Int" 49 | 50 | elif isinstance(expression, Bool): 51 | return "Bool" 52 | 53 | elif isinstance(expression, New): 54 | return returned_type(expression, _class) 55 | 56 | 57 | def isMethod(feature): 58 | return isinstance(feature, Method) 59 | 60 | 61 | def isAttribute(feature): 62 | return isinstance(feature, Attr) 63 | -------------------------------------------------------------------------------- /templates/syntactic.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | 4 | {% block content %} 5 | 6 | 7 |
8 |
9 |
10 |
11 |

12 | 13 |
14 |
15 |
16 | 17 | {% if serror or result %} 18 | 19 |
20 | 21 |

Análise

22 |

Resultado da análise sintática:

23 | 24 | {% if serror %} 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | {% for error in serror %} 36 | 37 | 38 | 39 | 40 | 41 | 42 | {% endfor %} 43 | 44 |
TokenLexemaLinha
{{ error.0 }}{{ error.1 }}{{ error.2 }}
45 | {% endif %} 46 | 47 | {% if result %} 48 |

49 | 50 |

51 | {% endif %} 52 | 53 | 54 |
55 | 56 | {% endif %} 57 | 58 | {% endblock %} -------------------------------------------------------------------------------- /examples/readme.txt: -------------------------------------------------------------------------------- 1 | CS 415 - Programming Languages - Wes Weimer 2 | Version 1.00 - Sat Jan 6 12:08:02 EST 2007 3 | 4 | This package contains a few simple Cool programs to help you get started. 5 | These are useful both for understanding Cool and as basic testcases 6 | for your scanner, parser, type checker and interpreter. 7 | 8 | These are all positive test cases. That is, they should all scan, parse, type 9 | check and execute correctly. You will have to construct your own negative test 10 | cases to exercise failure modes. We have many held-out testcases, both 11 | positive and negative, that are not present in this set. 12 | 13 | You are welcome to incorporate any of this code in your own assignments (e.g., 14 | in PA1). However, you *must* properly credit the inclusion in your readme. 15 | 16 | The files are: 17 | 18 | hello-world.cl prints "Hello, world.\n" to standard output 19 | 20 | atoi.cl an integer-to-string and string-to-integer class for Cool 21 | 22 | list.cl a well-commented linked list example 23 | 24 | sort-list.cl another linked list example; this one includes sorting 25 | 26 | arith.cl a "menu-driven" interactive desktop calculator 27 | (includes an inlined version of atoi) 28 | 29 | cells.cl simple cellular automaton simulator 30 | 31 | primes.cl a "methodless" program that enumerates all of the primes 32 | between 2 and 500. It is not a good example of object-oriented 33 | style, but it does show off some corner cases of Cool. 34 | 35 | print-cool.cl a more complicated hello-world that prints "cool\n" 36 | 37 | new-complex.cl a complex arithmetic and equality regression test 38 | 39 | hs.cl "hairy-scary" is a torture regression test 40 | 41 | That's it! 42 | -------------------------------------------------------------------------------- /src/lexical/tokrules.py: -------------------------------------------------------------------------------- 1 | # Reserved words 2 | reserved = [ 3 | 'class', 'in', 'inherits', 'isvoid', 'let', 'new', 'of', 'not', 4 | 'loop', 'pool', 'case', 'esac', 'if', 'then', 'else', 'fi', 'while' 5 | ] 6 | 7 | tokens = [ 8 | 'COMMENTINLINE', 'DARROW', 'CLASS', 'IN', 'INHERITS', 'ISVOID', 'LET', 9 | 'NEW', 'OF', 'NOT', 'LOOP', 'POOL', 'CASE', 'ESAC', 'IF', 'THEN', 'ELSE', 10 | 'FI', 'WHILE', 'ASSIGN', 'LE', 'PLUS', 'MINUS', 'MULT', 'DIV', 'LPAREN', 11 | 'RPAREN', 'LBRACE', 'RBRACE', 'DOT', 'COLON', 'COMMA', 'SEMI', 'EQ', 12 | 'NEG', 'LT', 'AT', 'TYPEID', 'OBJECTID', 'INT_CONST', 'STR_CONST', 13 | 'COMMENT', 'BOOL_CONST' 14 | ] 15 | 16 | # Regex dos Tokens 17 | t_DARROW = '=>' 18 | t_ASSIGN = '<-' 19 | t_LE = '<=' 20 | t_PLUS = r'\+' 21 | t_MINUS = r'-' 22 | t_MULT = r'\*' 23 | t_DIV = r'/' 24 | t_LPAREN = r'\(' 25 | t_RPAREN = r'\)' 26 | t_LBRACE = r'\{' 27 | t_RBRACE = r'\}' 28 | t_DOT = r'\.' 29 | t_COLON = ':' 30 | t_COMMA = ',' 31 | t_SEMI = ';' 32 | t_EQ = '=' 33 | t_NEG = '~' 34 | t_LT = '<' 35 | t_AT = '@' 36 | 37 | t_ignore = ' \t\r\f' 38 | 39 | 40 | # Handle objects_types_and_reserved_words 41 | def t_ID(t): 42 | r'[a-zA-Z_][a-zA-Z_0-9]*' 43 | if t.value == 'true': 44 | t.type = 'BOOL_CONST' 45 | t.value = True 46 | return t 47 | if t.value == 'false': 48 | t.type = 'BOOL_CONST' 49 | t.value = False 50 | return t 51 | 52 | if t.value.lower() in reserved: 53 | t.type = t.value.upper() 54 | else: 55 | if t.value[0].islower(): 56 | t.type = 'OBJECTID' 57 | else: 58 | t.type = 'TYPEID' 59 | return t 60 | 61 | 62 | def t_COMMENT(t): 63 | r'--.* | \(\*.+[\n\*\w\s]*\*\)' 64 | pass 65 | 66 | 67 | def t_STRING(t): 68 | r'\"[^"]*\"' 69 | # Tira as aspas (only python 2) 70 | t.value = t.value[1:-1].decode("string-escape") 71 | t.type = 'STR_CONST' 72 | return t 73 | 74 | 75 | def t_INT_CONST(t): 76 | r'\d+' 77 | t.value = int(t.value) 78 | return t 79 | 80 | 81 | def t_NEWLINE(t): 82 | r'\n+' 83 | t.lexer.lineno += t.value.count("\n") 84 | 85 | 86 | lerror = [] 87 | 88 | 89 | def t_error(t): 90 | lr = (t.value[0], t.lineno, t.lexpos) 91 | lerror.append(lr) 92 | t.lexer.skip(1) 93 | -------------------------------------------------------------------------------- /templates/lexico.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | 4 | {% block content %} 5 | 6 | 7 |
8 |
9 |
10 |
11 |

12 | 13 |
14 |
15 |
16 | 17 | {% if llex or lerror %} 18 | 19 |
20 | 21 |

Análise

22 |

Resultado da análise léxica:

23 | 24 | {% if lerror %} 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | {% for error in lerror %} 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | {% endfor %} 44 | 45 |
TokenLexemaLinha
ERROR{{ error.0 }}{{ error.1 }}
46 | {% endif %} 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | {% for tok in llex %} 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | {% endfor %} 69 | 70 |
TokenLexemaLinhaColuna
{{ tok.0 }}{{ tok.1 }}{{ tok.2 }}{{ tok.3 }}
71 | 72 |
73 | 74 | {% endif %} 75 | 76 | {% endblock %} -------------------------------------------------------------------------------- /examples/cells.cl: -------------------------------------------------------------------------------- 1 | (* models one-dimensional cellular automaton on a circle of finite radius 2 | arrays are faked as Strings, 3 | X's respresent live cells, dots represent dead cells, 4 | no error checking is done *) 5 | class CellularAutomaton inherits IO { 6 | population_map : String; 7 | 8 | init(map : String) : SELF_TYPE { 9 | { 10 | population_map <- map; 11 | self; 12 | } 13 | }; 14 | 15 | print() : SELF_TYPE { 16 | { 17 | out_string(population_map.concat("\n")); 18 | self; 19 | } 20 | }; 21 | 22 | num_cells() : Int { 23 | population_map.length() 24 | }; 25 | 26 | cell(position : Int) : String { 27 | population_map.substr(position, 1) 28 | }; 29 | 30 | cell_left_neighbor(position : Int) : String { 31 | if position = 0 then 32 | cell(num_cells() - 1) 33 | else 34 | cell(position - 1) 35 | fi 36 | }; 37 | 38 | cell_right_neighbor(position : Int) : String { 39 | if position = num_cells() - 1 then 40 | cell(0) 41 | else 42 | cell(position + 1) 43 | fi 44 | }; 45 | 46 | (* a cell will live if exactly 1 of itself and it's immediate 47 | neighbors are alive *) 48 | cell_at_next_evolution(position : Int) : String { 49 | if (if cell(position) = "X" then 1 else 0 fi 50 | + if cell_left_neighbor(position) = "X" then 1 else 0 fi 51 | + if cell_right_neighbor(position) = "X" then 1 else 0 fi 52 | = 1) 53 | then 54 | "X" 55 | else 56 | "." 57 | fi 58 | }; 59 | 60 | evolve() : SELF_TYPE { 61 | (let position : Int in 62 | (let num : Int <- num_cells() in 63 | (let temp : String in 64 | { 65 | while position < num loop 66 | { 67 | temp <- temp.concat(cell_at_next_evolution(position)); 68 | position <- position + 1; 69 | } 70 | pool; 71 | population_map <- temp; 72 | self; 73 | } 74 | ) ) ) 75 | }; 76 | }; 77 | 78 | class Main { 79 | cells : CellularAutomaton; 80 | 81 | main() : SELF_TYPE { 82 | { 83 | cells <- (new CellularAutomaton).init(" X "); 84 | cells.print(); 85 | (let countdown : Int <- 20 in 86 | while 0 < countdown loop 87 | { 88 | cells.evolve(); 89 | cells.print(); 90 | countdown <- countdown - 1; 91 | } 92 | pool 93 | ); 94 | self; 95 | } 96 | }; 97 | }; 98 | -------------------------------------------------------------------------------- /examples/primes.cl: -------------------------------------------------------------------------------- 1 | 2 | (* 3 | * methodless-primes.cl 4 | * 5 | * Designed by Jesse H. Willett, jhw@cory, 11103234, with 6 | * Istvan Siposs, isiposs@cory, 12342921. 7 | * 8 | * This program generates primes in order without using any methods. 9 | * Actually, it does use three methods: those of IO to print out each 10 | * prime, and abort() to halt the program. These methods are incidental, 11 | * however, to the information-processing functionality of the program. We 12 | * could regard the attribute 'out's sequential values as our output, and 13 | * the string "halt" as our terminate signal. 14 | * 15 | * Naturally, using Cool this way is a real waste, basically reducing it 16 | * to assembly without the benefit of compilation. 17 | * 18 | * There could even be a subroutine-like construction, in that different 19 | * code could be in the assign fields of attributes of other classes, 20 | * and it could be executed by calling 'new Sub', but no parameters 21 | * could be passed to the subroutine, and it could only return itself. 22 | * but returning itself would be useless since we couldn't call methods 23 | * and the only operators we have are for Int and Bool, which do nothing 24 | * interesting when we initialize them! 25 | *) 26 | 27 | class Main inherits IO { 28 | 29 | main() : Int { -- main() is an atrophied method so we can parse. 30 | 0 31 | }; 32 | 33 | out : Int <- -- out is our 'output'. Its values are the primes. 34 | { 35 | out_string("2 is trivially prime.\n"); 36 | 2; 37 | }; 38 | 39 | testee : Int <- out; -- testee is a number to be tested for primeness. 40 | 41 | divisor : Int; -- divisor is a number which may factor testee. 42 | 43 | stop : Int <- 500; -- stop is an arbitrary value limiting testee. 44 | 45 | m : Object <- -- m supplants the main method. 46 | while true loop 47 | { 48 | 49 | testee <- testee + 1; 50 | divisor <- 2; 51 | 52 | while 53 | if testee < divisor * divisor 54 | then false -- can stop if divisor > sqrt(testee). 55 | else if testee - divisor*(testee/divisor) = 0 56 | then false -- can stop if divisor divides testee. 57 | else true 58 | fi fi 59 | loop 60 | divisor <- divisor + 1 61 | pool; 62 | 63 | if testee < divisor * divisor -- which reason did we stop for? 64 | then -- testee has no factors less than sqrt(testee). 65 | { 66 | out <- testee; -- we could think of out itself as the output. 67 | out_int(out); 68 | out_string(" is prime.\n"); 69 | } 70 | else -- the loop halted on testee/divisor = 0, testee isn't prime. 71 | 0 -- testee isn't prime, do nothing. 72 | fi; 73 | 74 | if stop <= testee then 75 | "halt".abort() -- we could think of "halt" as SIGTERM. 76 | else 77 | "continue" 78 | fi; 79 | 80 | } 81 | pool; 82 | 83 | }; (* end of Main *) 84 | 85 | -------------------------------------------------------------------------------- /examples/atoi.cl: -------------------------------------------------------------------------------- 1 | (* 2 | The class A2I provides integer-to-string and string-to-integer 3 | conversion routines. To use these routines, either inherit them 4 | in the class where needed, have a dummy variable bound to 5 | something of type A2I, or simpl write (new A2I).method(argument). 6 | *) 7 | 8 | 9 | (* 10 | c2i Converts a 1-character string to an integer. Aborts 11 | if the string is not "0" through "9" 12 | *) 13 | class A2I { 14 | 15 | c2i(char : String) : Int { 16 | if char = "0" then 0 else 17 | if char = "1" then 1 else 18 | if char = "2" then 2 else 19 | if char = "3" then 3 else 20 | if char = "4" then 4 else 21 | if char = "5" then 5 else 22 | if char = "6" then 6 else 23 | if char = "7" then 7 else 24 | if char = "8" then 8 else 25 | if char = "9" then 9 else 26 | { abort(); 0; } -- the 0 is needed to satisfy the typchecker 27 | fi fi fi fi fi fi fi fi fi fi 28 | }; 29 | 30 | (* 31 | i2c is the inverse of c2i. 32 | *) 33 | i2c(i : Int) : String { 34 | if i = 0 then "0" else 35 | if i = 1 then "1" else 36 | if i = 2 then "2" else 37 | if i = 3 then "3" else 38 | if i = 4 then "4" else 39 | if i = 5 then "5" else 40 | if i = 6 then "6" else 41 | if i = 7 then "7" else 42 | if i = 8 then "8" else 43 | if i = 9 then "9" else 44 | { abort(); ""; } -- the "" is needed to satisfy the typchecker 45 | fi fi fi fi fi fi fi fi fi fi 46 | }; 47 | 48 | (* 49 | a2i converts an ASCII string into an integer. The empty string 50 | is converted to 0. Signed and unsigned strings are handled. The 51 | method aborts if the string does not represent an integer. Very 52 | long strings of digits produce strange answers because of arithmetic 53 | overflow. 54 | 55 | *) 56 | a2i(s : String) : Int { 57 | if s.length() = 0 then 0 else 58 | if s.substr(0,1) = "-" then ~a2i_aux(s.substr(1,s.length()-1)) else 59 | if s.substr(0,1) = "+" then a2i_aux(s.substr(1,s.length()-1)) else 60 | a2i_aux(s) 61 | fi fi fi 62 | }; 63 | 64 | (* 65 | a2i_aux converts the usigned portion of the string. As a programming 66 | example, this method is written iteratively. 67 | *) 68 | a2i_aux(s : String) : Int { 69 | (let int : Int <- 0 in 70 | { 71 | (let j : Int <- s.length() in 72 | (let i : Int <- 0 in 73 | while i < j loop 74 | { 75 | int <- int * 10 + c2i(s.substr(i,1)); 76 | i <- i + 1; 77 | } 78 | pool 79 | ) 80 | ); 81 | int; 82 | } 83 | ) 84 | }; 85 | 86 | (* 87 | i2a converts an integer to a string. Positive and negative 88 | numbers are handled correctly. 89 | *) 90 | i2a(i : Int) : String { 91 | if i = 0 then "0" else 92 | if 0 < i then i2a_aux(i) else 93 | "-".concat(i2a_aux(i * ~1)) 94 | fi fi 95 | }; 96 | 97 | (* 98 | i2a_aux is an example using recursion. 99 | *) 100 | i2a_aux(i : Int) : String { 101 | if i = 0 then "" else 102 | (let next : Int <- i / 10 in 103 | i2a_aux(next).concat(i2c(i - next * 10)) 104 | ) 105 | fi 106 | }; 107 | 108 | }; 109 | 110 | class Main inherits IO { 111 | main () : Object { 112 | let a : Int <- (new A2I).a2i("678987"), 113 | b : String <- (new A2I).i2a(678987) in 114 | { 115 | out_int(a) ; 116 | out_string(" == ") ; 117 | out_string(b) ; 118 | out_string("\n"); 119 | } 120 | } ; 121 | } ; 122 | -------------------------------------------------------------------------------- /examples/sort-list.cl: -------------------------------------------------------------------------------- 1 | (* 2 | This file presents a fairly large example of Cool programming. The 3 | class List defines the names of standard list operations ala Scheme: 4 | car, cdr, cons, isNil, rev, sort, rcons (add an element to the end of 5 | the list), and print_list. In the List class most of these functions 6 | are just stubs that abort if ever called. The classes Nil and Cons 7 | inherit from List and define the same operations, but now as 8 | appropriate to the empty list (for the Nil class) and for cons cells (for 9 | the Cons class). 10 | 11 | The Main class puts all of this code through the following silly 12 | test exercise: 13 | 14 | 1. prompt for a number N 15 | 2. generate a list of numbers 0..N-1 16 | 3. reverse the list 17 | 4. sort the list 18 | 5. print the sorted list 19 | 20 | Because the sort used is a quadratic space insertion sort, sorting 21 | moderately large lists can be quite slow. 22 | *) 23 | 24 | Class List inherits IO { 25 | (* Since abort() returns Object, we need something of 26 | type Bool at the end of the block to satisfy the typechecker. 27 | This code is unreachable, since abort() halts the program. *) 28 | isNil() : Bool { { abort(); true; } }; 29 | 30 | cons(hd : Int) : Cons { 31 | (let new_cell : Cons <- new Cons in 32 | new_cell.init(hd,self) 33 | ) 34 | }; 35 | 36 | (* 37 | Since abort "returns" type Object, we have to add 38 | an expression of type Int here to satisfy the typechecker. 39 | This code is, of course, unreachable. 40 | *) 41 | car() : Int { { abort(); new Int; } }; 42 | 43 | cdr() : List { { abort(); new List; } }; 44 | 45 | rev() : List { cdr() }; 46 | 47 | sort() : List { cdr() }; 48 | 49 | insert(i : Int) : List { cdr() }; 50 | 51 | rcons(i : Int) : List { cdr() }; 52 | 53 | print_list() : Object { abort() }; 54 | }; 55 | 56 | Class Cons inherits List { 57 | xcar : Int; -- We keep the car in cdr in attributes. 58 | xcdr : List; 59 | 60 | isNil() : Bool { false }; 61 | 62 | init(hd : Int, tl : List) : Cons { 63 | { 64 | xcar <- hd; 65 | xcdr <- tl; 66 | self; 67 | } 68 | }; 69 | 70 | car() : Int { xcar }; 71 | 72 | cdr() : List { xcdr }; 73 | 74 | rev() : List { (xcdr.rev()).rcons(xcar) }; 75 | 76 | sort() : List { (xcdr.sort()).insert(xcar) }; 77 | 78 | insert(i : Int) : List { 79 | if i < xcar then 80 | (new Cons).init(i,self) 81 | else 82 | (new Cons).init(xcar,xcdr.insert(i)) 83 | fi 84 | }; 85 | 86 | 87 | rcons(i : Int) : List { (new Cons).init(xcar, xcdr.rcons(i)) }; 88 | 89 | print_list() : Object { 90 | { 91 | out_int(xcar); 92 | out_string("\n"); 93 | xcdr.print_list(); 94 | } 95 | }; 96 | }; 97 | 98 | Class Nil inherits List { 99 | isNil() : Bool { true }; 100 | 101 | rev() : List { self }; 102 | 103 | sort() : List { self }; 104 | 105 | insert(i : Int) : List { rcons(i) }; 106 | 107 | rcons(i : Int) : List { (new Cons).init(i,self) }; 108 | 109 | print_list() : Object { true }; 110 | 111 | }; 112 | 113 | 114 | Class Main inherits IO { 115 | 116 | l : List; 117 | 118 | (* iota maps its integer argument n into the list 0..n-1 *) 119 | iota(i : Int) : List { 120 | { 121 | l <- new Nil; 122 | (let j : Int <- 0 in 123 | while j < i 124 | loop 125 | { 126 | l <- (new Cons).init(j,l); 127 | j <- j + 1; 128 | } 129 | pool 130 | ); 131 | l; 132 | } 133 | }; 134 | 135 | main() : Object { 136 | { 137 | out_string("How many numbers to sort? "); 138 | iota(in_int()).rev().sort().print_list(); 139 | } 140 | }; 141 | }; 142 | 143 | 144 | 145 | 146 | 147 | -------------------------------------------------------------------------------- /examples/list.cl: -------------------------------------------------------------------------------- 1 | (* 2 | * This file shows how to implement a list data type for lists of integers. 3 | * It makes use of INHERITANCE and DYNAMIC DISPATCH. 4 | * 5 | * The List class has 4 operations defined on List objects. If 'l' is 6 | * a list, then the methods dispatched on 'l' have the following effects: 7 | * 8 | * isNil() : Bool Returns true if 'l' is empty, false otherwise. 9 | * head() : Int Returns the integer at the head of 'l'. 10 | * If 'l' is empty, execution aborts. 11 | * tail() : List Returns the remainder of the 'l', 12 | * i.e. without the first element. 13 | * cons(i : Int) : List Return a new list containing i as the 14 | * first element, followed by the 15 | * elements in 'l'. 16 | * 17 | * There are 2 kinds of lists, the empty list and a non-empty 18 | * list. We can think of the non-empty list as a specialization of 19 | * the empty list. 20 | * The class List defines the operations on empty list. The class 21 | * Cons inherits from List and redefines things to handle non-empty 22 | * lists. 23 | *) 24 | 25 | 26 | class List { 27 | -- Define operations on empty lists. 28 | 29 | isNil() : Bool { true }; 30 | 31 | -- Since abort() has return type Object and head() has return type 32 | -- Int, we need to have an Int as the result of the method body, 33 | -- even though abort() never returns. 34 | 35 | head() : Int { { abort(); 0; } }; 36 | 37 | -- As for head(), the self is just to make sure the return type of 38 | -- tail() is correct. 39 | 40 | tail() : List { { abort(); self; } }; 41 | 42 | -- When we cons and element onto the empty list we get a non-empty 43 | -- list. The (new Cons) expression creates a new list cell of class 44 | -- Cons, which is initialized by a dispatch to init(). 45 | -- The result of init() is an element of class Cons, but it 46 | -- conforms to the return type List, because Cons is a subclass of 47 | -- List. 48 | 49 | cons(i : Int) : List { 50 | (new Cons).init(i, self) 51 | }; 52 | 53 | }; 54 | 55 | 56 | (* 57 | * Cons inherits all operations from List. We can reuse only the cons 58 | * method though, because adding an element to the front of an emtpy 59 | * list is the same as adding it to the front of a non empty 60 | * list. All other methods have to be redefined, since the behaviour 61 | * for them is different from the empty list. 62 | * 63 | * Cons needs two attributes to hold the integer of this list 64 | * cell and to hold the rest of the list. 65 | * 66 | * The init() method is used by the cons() method to initialize the 67 | * cell. 68 | *) 69 | 70 | class Cons inherits List { 71 | 72 | car : Int; -- The element in this list cell 73 | 74 | cdr : List; -- The rest of the list 75 | 76 | isNil() : Bool { false }; 77 | 78 | head() : Int { car }; 79 | 80 | tail() : List { cdr }; 81 | 82 | init(i : Int, rest : List) : List { 83 | { 84 | car <- i; 85 | cdr <- rest; 86 | self; 87 | } 88 | }; 89 | 90 | }; 91 | 92 | 93 | 94 | (* 95 | * The Main class shows how to use the List class. It creates a small 96 | * list and then repeatedly prints out its elements and takes off the 97 | * first element of the list. 98 | *) 99 | 100 | class Main inherits IO { 101 | 102 | mylist : List; 103 | 104 | -- Print all elements of the list. Calls itself recursively with 105 | -- the tail of the list, until the end of the list is reached. 106 | 107 | print_list(l : List) : Object { 108 | if l.isNil() then out_string("\n") 109 | else { 110 | out_int(l.head()); 111 | out_string(" "); 112 | print_list(l.tail()); 113 | } 114 | fi 115 | }; 116 | 117 | -- Note how the dynamic dispatch mechanism is responsible to end 118 | -- the while loop. As long as mylist is bound to an object of 119 | -- dynamic type Cons, the dispatch to isNil calls the isNil method of 120 | -- the Cons class, which returns false. However when we reach the 121 | -- end of the list, mylist gets bound to the object that was 122 | -- created by the (new List) expression. This object is of dynamic type 123 | -- List, and thus the method isNil in the List class is called and 124 | -- returns true. 125 | 126 | main() : Object { 127 | { 128 | mylist <- new List.cons(1).cons(2).cons(3).cons(4).cons(5); 129 | while (not mylist.isNil()) loop 130 | { 131 | print_list(mylist); 132 | mylist <- mylist.tail(); 133 | } 134 | pool; 135 | } 136 | }; 137 | 138 | }; 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /src/semantic/myexceptions.py: -------------------------------------------------------------------------------- 1 | class SemantError(Exception): 2 | pass 3 | 4 | 5 | class UndefinedMethodError(SemantError): 6 | 7 | def __init__(self, method, _class): 8 | msg = 'A undefined method %s was called in class %s' 9 | super(UndefinedMethodError, self).__init__(msg % (method, _class)) 10 | 11 | 12 | class ReturnedTypeError(SemantError): 13 | 14 | def __init__(self, method, _class, expected, returned): 15 | msg = 'The method %s in class %s returns wrong type. Expected %s, returned %s.' 16 | super(ReturnedTypeError, self).__init__( 17 | msg % (method, _class, expected, returned) 18 | ) 19 | 20 | 21 | class ArgumentTypeError(SemantError): 22 | 23 | def __init__(self, method, class_name): 24 | m = "Argument %s passed to method %s in class %s have a different type" 25 | try: 26 | # If is an Object, there is a name, 27 | content_or_name = method.name 28 | except AttributeError: 29 | # if not, there is a content instead 30 | content_or_name = method.content 31 | super(ArgumentTypeError, self).__init__( 32 | m % (content_or_name, method.name, class_name) 33 | ) 34 | 35 | 36 | class NumberOfArgumentError(SemantError): 37 | 38 | def __init__(self, method, _class): 39 | msg = 'Tried to call method %s in class %s with wrong number of arguments' 40 | super(NumberOfArgumentError, self).__init__(msg % (method, _class)) 41 | 42 | 43 | class RedefinedMethodError(SemantError): 44 | 45 | def __init__(self, method_nmae): 46 | msg = "Redefined method %s cannot change arguments or return type, they must be the same of the parent method" 47 | super(RedefinedMethodError, self).__init__(msg % (method_nmae)) 48 | 49 | 50 | class RedefinedAttributeError(SemantError): 51 | 52 | def __init__(self, class_nmae): 53 | msg = "Attribute cannot be redefined in child class %s" 54 | super(RedefinedAttributeError, self).__init__(msg % (class_nmae)) 55 | 56 | 57 | class UndefinedParentError(SemantError): 58 | 59 | def __init__(self, child, parent): 60 | msg = 'Classe %s inherit from an undefined parent %s' 61 | super(UndefinedParentError, self).__init__(msg % (child, parent)) 62 | 63 | 64 | class ClassAlreadyDefinedError(SemantError): 65 | 66 | def __init__(self, class_name): 67 | msg = 'Class %s already defined' 68 | super(ClassAlreadyDefinedError, self).__init__(msg % (class_name)) 69 | 70 | 71 | class InheritanceError(SemantError): 72 | 73 | def __init__(self, class_name): 74 | msg = '%s is in a inheritance cycle' 75 | super(InheritanceError, self).__init__(msg % (class_name)) 76 | 77 | 78 | class DeclaredTypeError(SemantError): 79 | 80 | def __init__(self, expression_type, value_type): 81 | msg = 'Let init %s is not equal to the declared type %s' 82 | super(DeclaredTypeError, self).__init__( 83 | msg % (value_type, expression_type) 84 | ) 85 | 86 | 87 | class AttributeTypeError(SemantError): 88 | 89 | def __init__(self, expression, value_type): 90 | msg = 'Expression %s was declared as %s and was passed %s' 91 | super(AttributeTypeError, self).__init__( 92 | msg % (expression.name, expression.type, value_type) 93 | ) 94 | 95 | 96 | class TypeCheckError(SemantError): 97 | 98 | def __init__(self, first_type, second_type, _class): 99 | msg = 'Must be a Integer to check with < , <= or = ! Was given %s and %s in class %s' 100 | super(TypeCheckError, self).__init__( 101 | msg % (first_type, second_type, _class.name) 102 | ) 103 | 104 | 105 | class EqualTypeCheckError(SemantError): 106 | 107 | def __init__(self, first_type, second_type, _class): 108 | msg = 'To compare two values, they must be String, Int or Bool. Was given %s and %s in class %s' 109 | super(EqualTypeCheckError, self).__init__( 110 | msg % (first_type, second_type, _class.name) 111 | ) 112 | 113 | 114 | class EqualCheckError(SemantError): 115 | 116 | def __init__(self, first_type, second_type, _class): 117 | msg = 'To compare two values, they must be the same type. Was given %s and %s in class %s' 118 | super(EqualCheckError, self).__init__( 119 | msg % (first_type, second_type, _class.name) 120 | ) 121 | 122 | 123 | class ArithmeticError(SemantError): 124 | 125 | def __init__(self, first_type, second_type, _class): 126 | msg = 'Arithmetic operations require integers! Was given %s and %s in class %s' 127 | super(ArithmeticError, self).__init__( 128 | msg % (first_type, second_type, _class.name) 129 | ) 130 | 131 | 132 | class AssignError(SemantError): 133 | 134 | def __init__(self, first_type, second_type, _class): 135 | msg = 'Assign operations require same types! Was given %s and %s in class %s' 136 | super(AssignError, self).__init__( 137 | msg % (first_type, second_type, _class.name) 138 | ) 139 | 140 | 141 | class ConditionStatementError(SemantError): 142 | 143 | def __init__(self, statement, value_type, _class): 144 | msg = '%s statement must have a boolean type, was given %s in class %s' 145 | super(ConditionStatementError, self).__init__( 146 | msg % (statement, value_type, _class.name) 147 | ) 148 | -------------------------------------------------------------------------------- /src/syntactic/syntactic.py: -------------------------------------------------------------------------------- 1 | import ply.yacc as yacc 2 | 3 | from ..lexical import MyLex 4 | from ..lexical.tokrules import * 5 | 6 | from ast import * 7 | 8 | 9 | def syntactic(string): 10 | 11 | def p_class_list_many(p): 12 | '''class_list : class_list class SEMI''' 13 | p[0] = p[1] + [p[2]] 14 | 15 | def p_class_list_single(p): 16 | '''class_list : class SEMI''' 17 | p[0] = [p[1]] 18 | 19 | def p_class(p): 20 | '''class : CLASS TYPEID LBRACE feature_list RBRACE''' 21 | p[0] = Class(p[2], "Object", p[4]) 22 | 23 | def p_class_inherits(p): 24 | '''class : CLASS TYPEID INHERITS TYPEID LBRACE feature_list RBRACE''' 25 | p[0] = Class(p[2], p[4], p[6]) 26 | 27 | def p_feature_list_many(p): 28 | '''feature_list : feature_list feature SEMI''' 29 | p[0] = p[1] + [p[2]] 30 | 31 | def p_feature_list_single(p): 32 | '''feature_list : feature SEMI''' 33 | p[0] = [p[1]] 34 | 35 | def p_feature_list_empty(p): 36 | '''feature_list : ''' 37 | p[0] = [] 38 | 39 | def p_feature_method(p): 40 | '''feature : OBJECTID LPAREN formal_list RPAREN COLON TYPEID LBRACE expression RBRACE''' 41 | p[0] = Method(p[1], p[3], p[6], p[8]) 42 | 43 | def p_feature_method_no_formals(p): 44 | '''feature : OBJECTID LPAREN RPAREN COLON TYPEID LBRACE expression RBRACE''' 45 | p[0] = Method(p[1], [], p[5], p[7]) 46 | 47 | def p_feature_attr_initialized(p): 48 | '''feature : OBJECTID COLON TYPEID ASSIGN expression''' 49 | p[0] = Attr(p[1], p[3], p[5]) 50 | 51 | def p_feature_attr(p): 52 | '''feature : OBJECTID COLON TYPEID''' 53 | p[0] = Attr(p[1], p[3], None) 54 | 55 | def p_formal_list_many(p): 56 | '''formal_list : formal_list COMMA formal''' 57 | p[0] = p[1] + [p[3]] 58 | 59 | def p_formal_list_single(p): 60 | '''formal_list : formal''' 61 | p[0] = [p[1]] 62 | 63 | def p_formal(p): 64 | '''formal : OBJECTID COLON TYPEID''' 65 | p[0] = (p[1], p[3]) 66 | 67 | def p_expression_object(p): 68 | '''expression : OBJECTID''' 69 | p[0] = Object(p[1]) 70 | 71 | def p_expression_int(p): 72 | '''expression : INT_CONST''' 73 | p[0] = Int(p[1]) 74 | 75 | def p_expression_bool(p): 76 | '''expression : BOOL_CONST''' 77 | p[0] = Bool(p[1]) 78 | 79 | def p_expression_str(p): 80 | '''expression : STR_CONST''' 81 | p[0] = Str(p[1]) 82 | 83 | def p_expression_block(p): 84 | '''expression : LBRACE block_list RBRACE''' 85 | p[0] = Block(p[2]) 86 | 87 | def p_block_list_many(p): 88 | '''block_list : block_list expression SEMI''' 89 | p[0] = p[1] + [p[2]] 90 | 91 | def p_block_list_single(p): 92 | '''block_list : expression SEMI''' 93 | p[0] = [p[1]] 94 | 95 | def p_expression_assignment(p): 96 | '''expression : OBJECTID ASSIGN expression''' 97 | p[0] = Assign(Object(p[1]), p[3]) 98 | 99 | def p_expression_dispatch(p): 100 | '''expression : expression DOT OBJECTID LPAREN expr_list RPAREN''' 101 | p[0] = Dispatch(p[1], p[3], p[5]) 102 | 103 | def p_expr_list_many(p): 104 | '''expr_list : expr_list COMMA expression''' 105 | p[0] = p[1] + [p[3]] 106 | 107 | def p_expr_list_single(p): 108 | '''expr_list : expression''' 109 | p[0] = [p[1]] 110 | 111 | def p_expr_list_empty(p): 112 | '''expr_list : ''' 113 | p[0] = [] 114 | 115 | def p_expression_static_dispatch(p): 116 | '''expression : expression AT TYPEID DOT OBJECTID LPAREN expr_list RPAREN''' 117 | p[0] = StaticDispatch(p[1], p[3], p[5], p[7]) 118 | 119 | def p_expression_self_dispatch(p): 120 | '''expression : OBJECTID LPAREN expr_list RPAREN''' 121 | p[0] = Dispatch("self", p[1], p[3]) 122 | 123 | def p_expression_basic_math(p): 124 | ''' 125 | expression : expression PLUS expression 126 | | expression MINUS expression 127 | | expression MULT expression 128 | | expression DIV expression 129 | ''' 130 | if p[2] == '+': 131 | p[0] = Plus(p[1], p[3]) 132 | elif p[2] == '-': 133 | p[0] = Sub(p[1], p[3]) 134 | elif p[2] == '*': 135 | p[0] = Mult(p[1], p[3]) 136 | elif p[2] == '/': 137 | p[0] = Div(p[1], p[3]) 138 | 139 | def p_expression_numerical_comparison(p): 140 | ''' 141 | expression : expression LT expression 142 | | expression LE expression 143 | | expression EQ expression 144 | ''' 145 | if p[2] == '<': 146 | p[0] = Lt(p[1], p[3]) 147 | elif p[2] == '<=': 148 | p[0] = Le(p[1], p[3]) 149 | elif p[2] == '=': 150 | p[0] = Eq(p[1], p[3]) 151 | 152 | def p_expression_with_parenthesis(p): 153 | '''expression : LPAREN expression RPAREN''' 154 | p[0] = p[2] 155 | 156 | def p_expression_if(p): 157 | '''expression : IF expression THEN expression ELSE expression FI''' 158 | p[0] = If(p[2], p[4], p[6]) 159 | 160 | def p_expression_while(p): 161 | '''expression : WHILE expression LOOP expression POOL''' 162 | p[0] = While(p[2], p[4]) 163 | 164 | def p_expression_let(p): 165 | """expression : LET OBJECTID COLON TYPEID IN expression 166 | expression : LET OBJECTID COLON TYPEID COMMA inner_lets""" 167 | p[0] = Let(p[2], p[4], None, p[6]) 168 | 169 | def p_expression_let_initialized(p): 170 | """expression : LET OBJECTID COLON TYPEID ASSIGN expression IN expression 171 | expression : LET OBJECTID COLON TYPEID ASSIGN expression COMMA inner_lets""" 172 | p[0] = Let(p[2], p[4], p[6], p[8]) 173 | 174 | def p_expression_let_with_error_in_first_decl(p): 175 | """expression : LET error COMMA OBJECTID COLON TYPEID IN expression 176 | expression : LET error COMMA OBJECTID COLON TYPEID COMMA inner_lets""" 177 | p[0] = Let(p[4], p[6], None, p[8]) 178 | 179 | def p_expression_let_initialized_with_error_in_first_decl(p): 180 | """expression : LET error COMMA OBJECTID COLON TYPEID ASSIGN expression IN expression 181 | expression : LET error COMMA OBJECTID COLON TYPEID ASSIGN expression COMMA inner_lets""" 182 | p[0] = Let(p[4], p[6], p[8], p[10]) 183 | 184 | def p_inner_lets_simple(p): 185 | """inner_lets : OBJECTID COLON TYPEID IN expression 186 | inner_lets : OBJECTID COLON TYPEID COMMA inner_lets """ 187 | p[0] = Let(p[1], p[3], None, p[5]) 188 | 189 | def p_inner_lets_initialized(p): 190 | """inner_lets : OBJECTID COLON TYPEID ASSIGN expression IN expression 191 | inner_lets : OBJECTID COLON TYPEID ASSIGN expression COMMA inner_lets""" 192 | p[0] = Let(p[1], p[3], p[5], p[7]) 193 | 194 | def p_expression_case(p): 195 | '''expression : CASE expression OF case_list ESAC''' 196 | p[0] = Case(p[2], p[4]) 197 | 198 | def p_case_list_one(p): 199 | '''case_list : case''' 200 | p[0] = [p[1]] 201 | 202 | def p_case_list_many(p): 203 | '''case_list : case_list case''' 204 | p[0] = p[1] + [p[2]] 205 | 206 | def p_case_expr(p): 207 | '''case : OBJECTID COLON TYPEID DARROW expression SEMI''' 208 | p[0] = (p[1], p[3], p[5]) 209 | 210 | def p_expression_new(p): 211 | '''expression : NEW TYPEID''' 212 | p[0] = New(p[2]) 213 | 214 | def p_expression_isvoid(p): 215 | '''expression : ISVOID expression''' 216 | p[0] = Isvoid(p[2]) 217 | 218 | def p_expression_neg(p): 219 | '''expression : NEG expression''' 220 | p[0] = Neg(p[2]) 221 | 222 | def p_expression_not(p): 223 | '''expression : NOT expression''' 224 | p[0] = Not(p[2]) 225 | 226 | precedence = ( 227 | ('right', 'ASSIGN'), 228 | ('left', 'NOT'), 229 | ('nonassoc', 'LE', 'LT', 'EQ'), 230 | ('left', 'PLUS', 'MINUS'), 231 | ('left', 'MULT', 'DIV'), 232 | ('left', 'ISVOID'), 233 | ('left', 'NEG'), 234 | ('left', 'AT'), 235 | ('left', 'DOT'), 236 | ) 237 | 238 | serror = [] 239 | 240 | # Error rule for syntax errors 241 | def p_error(p): 242 | er = (p.type, p.value[0], p.lineno, p.lexpos) 243 | serror.append(er) 244 | print('parser error: {}'.format(p)) 245 | 246 | # Build the parser 247 | parser = yacc.yacc() 248 | 249 | l = MyLex() 250 | lexer = l.lexer 251 | 252 | result = parser.parse(string, lexer=lexer) 253 | 254 | return result, serror 255 | 256 | 257 | if __name__ == '__main__': 258 | import sys 259 | 260 | if len(sys.argv) > 1: 261 | with open(sys.argv[1]) as file: 262 | data = file.read() 263 | 264 | result, errors = syntactic(data) 265 | if result: 266 | print('\nOK!\n') 267 | else: 268 | print('A cool file is required.') 269 | -------------------------------------------------------------------------------- /examples/arith.cl: -------------------------------------------------------------------------------- 1 | (* 2 | * A contribution from Anne Sheets (sheets@cory) 3 | * 4 | * Tests the arithmetic operations and various other things 5 | *) 6 | 7 | class A { 8 | 9 | var : Int <- 0; 10 | 11 | value() : Int { var }; 12 | 13 | set_var(num : Int) : SELF_TYPE { 14 | { 15 | var <- num; 16 | self; 17 | } 18 | }; 19 | 20 | method1(num : Int) : SELF_TYPE { -- same 21 | self 22 | }; 23 | 24 | method2(num1 : Int, num2 : Int) : B { -- plus 25 | (let x : Int in 26 | { 27 | x <- num1 + num2; 28 | (new B).set_var(x); 29 | } 30 | ) 31 | }; 32 | 33 | method3(num : Int) : C { -- negate 34 | (let x : Int in 35 | { 36 | x <- ~num; 37 | (new C).set_var(x); 38 | } 39 | ) 40 | }; 41 | 42 | method4(num1 : Int, num2 : Int) : D { -- diff 43 | if num2 < num1 then 44 | (let x : Int in 45 | { 46 | x <- num1 - num2; 47 | (new D).set_var(x); 48 | } 49 | ) 50 | else 51 | (let x : Int in 52 | { 53 | x <- num2 - num1; 54 | (new D).set_var(x); 55 | } 56 | ) 57 | fi 58 | }; 59 | 60 | method5(num : Int) : E { -- factorial 61 | (let x : Int <- 1 in 62 | { 63 | (let y : Int <- 1 in 64 | while y <= num loop 65 | { 66 | x <- x * y; 67 | y <- y + 1; 68 | } 69 | pool 70 | ); 71 | (new E).set_var(x); 72 | } 73 | ) 74 | }; 75 | 76 | }; 77 | 78 | class B inherits A { -- B is a number squared 79 | 80 | method5(num : Int) : E { -- square 81 | (let x : Int in 82 | { 83 | x <- num * num; 84 | (new E).set_var(x); 85 | } 86 | ) 87 | }; 88 | 89 | }; 90 | 91 | class C inherits B { 92 | 93 | method6(num : Int) : A { -- negate 94 | (let x : Int in 95 | { 96 | x <- ~num; 97 | (new A).set_var(x); 98 | } 99 | ) 100 | }; 101 | 102 | method5(num : Int) : E { -- cube 103 | (let x : Int in 104 | { 105 | x <- num * num * num; 106 | (new E).set_var(x); 107 | } 108 | ) 109 | }; 110 | 111 | }; 112 | 113 | class D inherits B { 114 | 115 | method7(num : Int) : Bool { -- divisible by 3 116 | (let x : Int <- num in 117 | if x < 0 then method7(~x) else 118 | if 0 = x then true else 119 | if 1 = x then false else 120 | if 2 = x then false else 121 | method7(x - 3) 122 | fi fi fi fi 123 | ) 124 | }; 125 | 126 | }; 127 | 128 | class E inherits D { 129 | 130 | method6(num : Int) : A { -- division 131 | (let x : Int in 132 | { 133 | x <- num / 8; 134 | (new A).set_var(x); 135 | } 136 | ) 137 | }; 138 | 139 | }; 140 | 141 | (* The following code is from atoi.cl in ~cs164/examples *) 142 | 143 | (* 144 | The class A2I provides integer-to-string and string-to-integer 145 | conversion routines. To use these routines, either inherit them 146 | in the class where needed, have a dummy variable bound to 147 | something of type A2I, or simpl write (new A2I).method(argument). 148 | *) 149 | 150 | 151 | (* 152 | c2i Converts a 1-character string to an integer. Aborts 153 | if the string is not "0" through "9" 154 | *) 155 | class A2I { 156 | 157 | c2i(char : String) : Int { 158 | if char = "0" then 0 else 159 | if char = "1" then 1 else 160 | if char = "2" then 2 else 161 | if char = "3" then 3 else 162 | if char = "4" then 4 else 163 | if char = "5" then 5 else 164 | if char = "6" then 6 else 165 | if char = "7" then 7 else 166 | if char = "8" then 8 else 167 | if char = "9" then 9 else 168 | { abort(); 0; } (* the 0 is needed to satisfy the 169 | typchecker *) 170 | fi fi fi fi fi fi fi fi fi fi 171 | }; 172 | 173 | (* 174 | i2c is the inverse of c2i. 175 | *) 176 | i2c(i : Int) : String { 177 | if i = 0 then "0" else 178 | if i = 1 then "1" else 179 | if i = 2 then "2" else 180 | if i = 3 then "3" else 181 | if i = 4 then "4" else 182 | if i = 5 then "5" else 183 | if i = 6 then "6" else 184 | if i = 7 then "7" else 185 | if i = 8 then "8" else 186 | if i = 9 then "9" else 187 | { abort(); ""; } -- the "" is needed to satisfy the typchecker 188 | fi fi fi fi fi fi fi fi fi fi 189 | }; 190 | 191 | (* 192 | a2i converts an ASCII string into an integer. The empty string 193 | is converted to 0. Signed and unsigned strings are handled. The 194 | method aborts if the string does not represent an integer. Very 195 | long strings of digits produce strange answers because of arithmetic 196 | overflow. 197 | 198 | *) 199 | a2i(s : String) : Int { 200 | if s.length() = 0 then 0 else 201 | if s.substr(0,1) = "-" then ~a2i_aux(s.substr(1,s.length()-1)) else 202 | if s.substr(0,1) = "+" then a2i_aux(s.substr(1,s.length()-1)) else 203 | a2i_aux(s) 204 | fi fi fi 205 | }; 206 | 207 | (* a2i_aux converts the usigned portion of the string. As a 208 | programming example, this method is written iteratively. *) 209 | 210 | 211 | a2i_aux(s : String) : Int { 212 | (let int : Int <- 0 in 213 | { 214 | (let j : Int <- s.length() in 215 | (let i : Int <- 0 in 216 | while i < j loop 217 | { 218 | int <- int * 10 + c2i(s.substr(i,1)); 219 | i <- i + 1; 220 | } 221 | pool 222 | ) 223 | ); 224 | int; 225 | } 226 | ) 227 | }; 228 | 229 | (* i2a converts an integer to a string. Positive and negative 230 | numbers are handled correctly. *) 231 | 232 | i2a(i : Int) : String { 233 | if i = 0 then "0" else 234 | if 0 < i then i2a_aux(i) else 235 | "-".concat(i2a_aux(i * ~1)) 236 | fi fi 237 | }; 238 | 239 | (* i2a_aux is an example using recursion. *) 240 | 241 | i2a_aux(i : Int) : String { 242 | if i = 0 then "" else 243 | (let next : Int <- i / 10 in 244 | i2a_aux(next).concat(i2c(i - next * 10)) 245 | ) 246 | fi 247 | }; 248 | 249 | }; 250 | 251 | class Main inherits IO { 252 | 253 | char : String; 254 | avar : A; 255 | a_var : A; 256 | flag : Bool <- true; 257 | 258 | 259 | menu() : String { 260 | { 261 | out_string("\n\tTo add a number to "); 262 | print(avar); 263 | out_string("...enter a:\n"); 264 | out_string("\tTo negate "); 265 | print(avar); 266 | out_string("...enter b:\n"); 267 | out_string("\tTo find the difference between "); 268 | print(avar); 269 | out_string("and another number...enter c:\n"); 270 | out_string("\tTo find the factorial of "); 271 | print(avar); 272 | out_string("...enter d:\n"); 273 | out_string("\tTo square "); 274 | print(avar); 275 | out_string("...enter e:\n"); 276 | out_string("\tTo cube "); 277 | print(avar); 278 | out_string("...enter f:\n"); 279 | out_string("\tTo find out if "); 280 | print(avar); 281 | out_string("is a multiple of 3...enter g:\n"); 282 | out_string("\tTo divide "); 283 | print(avar); 284 | out_string("by 8...enter h:\n"); 285 | out_string("\tTo get a new number...enter j:\n"); 286 | out_string("\tTo quit...enter q:\n\n"); 287 | in_string(); 288 | } 289 | }; 290 | 291 | prompt() : String { 292 | { 293 | out_string("\n"); 294 | out_string("Please enter a number... "); 295 | in_string(); 296 | } 297 | }; 298 | 299 | get_int() : Int { 300 | { 301 | (let z : A2I <- new A2I in 302 | (let s : String <- prompt() in 303 | z.a2i(s) 304 | ) 305 | ); 306 | } 307 | }; 308 | 309 | is_even(num : Int) : Bool { 310 | (let x : Int <- num in 311 | if x < 0 then is_even(~x) else 312 | if 0 = x then true else 313 | if 1 = x then false else 314 | is_even(x - 2) 315 | fi fi fi 316 | ) 317 | }; 318 | 319 | class_type(var : A) : SELF_TYPE { 320 | case var of 321 | a : A => out_string("Class type is now A\n"); 322 | b : B => out_string("Class type is now B\n"); 323 | c : C => out_string("Class type is now C\n"); 324 | d : D => out_string("Class type is now D\n"); 325 | e : E => out_string("Class type is now E\n"); 326 | o : Object => out_string("Oooops\n"); 327 | esac 328 | }; 329 | 330 | print(var : A) : SELF_TYPE { 331 | (let z : A2I <- new A2I in 332 | { 333 | out_string(z.i2a(var.value())); 334 | out_string(" "); 335 | } 336 | ) 337 | }; 338 | 339 | main() : Object { 340 | { 341 | avar <- (new A); 342 | while flag loop 343 | { 344 | -- avar <- (new A).set_var(get_int()); 345 | out_string("number "); 346 | print(avar); 347 | if is_even(avar.value()) then 348 | out_string("is even!\n") 349 | else 350 | out_string("is odd!\n") 351 | fi; 352 | -- print(avar); -- prints out answer 353 | class_type(avar); 354 | char <- menu(); 355 | if char = "a" then -- add 356 | { 357 | a_var <- (new A).set_var(get_int()); 358 | avar <- (new B).method2(avar.value(), a_var.value()); 359 | } else 360 | if char = "b" then -- negate 361 | case avar of 362 | c : C => avar <- c.method6(c.value()); 363 | a : A => avar <- a.method3(a.value()); 364 | o : Object => { 365 | out_string("Oooops\n"); 366 | abort(); 0; 367 | }; 368 | esac else 369 | if char = "c" then -- diff 370 | { 371 | a_var <- (new A).set_var(get_int()); 372 | avar <- (new D).method4(avar.value(), a_var.value()); 373 | } else 374 | if char = "d" then avar <- (new C)@A.method5(avar.value()) else 375 | -- factorial 376 | if char = "e" then avar <- (new C)@B.method5(avar.value()) else 377 | -- square 378 | if char = "f" then avar <- (new C)@C.method5(avar.value()) else 379 | -- cube 380 | if char = "g" then -- multiple of 3? 381 | if ((new D).method7(avar.value())) 382 | then -- avar <- (new A).method1(avar.value()) 383 | { 384 | out_string("number "); 385 | print(avar); 386 | out_string("is divisible by 3.\n"); 387 | } 388 | else -- avar <- (new A).set_var(0) 389 | { 390 | out_string("number "); 391 | print(avar); 392 | out_string("is not divisible by 3.\n"); 393 | } 394 | fi else 395 | if char = "h" then 396 | (let x : A in 397 | { 398 | x <- (new E).method6(avar.value()); 399 | (let r : Int <- (avar.value() - (x.value() * 8)) in 400 | { 401 | out_string("number "); 402 | print(avar); 403 | out_string("is equal to "); 404 | print(x); 405 | out_string("times 8 with a remainder of "); 406 | (let a : A2I <- new A2I in 407 | { 408 | out_string(a.i2a(r)); 409 | out_string("\n"); 410 | } 411 | ); -- end let a: 412 | } 413 | ); -- end let r: 414 | avar <- x; 415 | } 416 | ) -- end let x: 417 | else 418 | if char = "j" then avar <- (new A) 419 | else 420 | if char = "q" then flag <- false 421 | else 422 | avar <- (new A).method1(avar.value()) -- divide/8 423 | fi fi fi fi fi fi fi fi fi fi; 424 | } 425 | pool; 426 | } 427 | }; 428 | 429 | }; 430 | 431 | -------------------------------------------------------------------------------- /src/semantic/semantic.py: -------------------------------------------------------------------------------- 1 | from collections import defaultdict 2 | from copy import deepcopy 3 | 4 | from ..syntactic.ast import * 5 | 6 | from myexceptions import ( 7 | UndefinedMethodError, ReturnedTypeError, 8 | NumberOfArgumentError, RedefinedMethodError, RedefinedAttributeError, 9 | UndefinedParentError, ClassAlreadyDefinedError, InheritanceError, 10 | ArgumentTypeError, DeclaredTypeError, AttributeTypeError, 11 | TypeCheckError, ConditionStatementError, ArithmeticError, AssignError, 12 | EqualTypeCheckError, EqualCheckError 13 | ) 14 | from scope import Scope 15 | from checktype import ( 16 | get_expression_type, returned_type, isAttribute, isMethod 17 | ) 18 | 19 | 20 | class Semant(object): 21 | """ Analyzes semantically the code. """ 22 | 23 | def __init__(self, ast): 24 | self.ast = ast 25 | self.classes = {} 26 | self.parents = defaultdict(set) 27 | self.scope = Scope() 28 | 29 | def build(self): 30 | self.__create_default_classes() 31 | self.__create_symbol_tables() 32 | self.__check_undefined_classes() 33 | self.__check_inheritance_cycles() 34 | self.__check_inheritence_and_add_methods_in_children() 35 | 36 | for _class in self.classes.keys(): 37 | self.__check_scope_and_type(self.classes[_class]) 38 | 39 | def __create_default_classes(self): 40 | # Object there is no parent 41 | objc = Class("Object", None, [ 42 | Method('abort', [], 'Object', None), 43 | Method('type_name', [], 'String', None), 44 | Method('copy', [], 'SELF_TYPE', None), 45 | ]) 46 | # IO inherits from Object 47 | ioc = Class("IO", "Object", [ 48 | Method('out_string', [('arg', 'String')], 'SELF_TYPE', None), 49 | Method('out_int', [('arg', 'Int')], 'SELF_TYPE', None), 50 | Method('in_string', [], 'String', None), 51 | Method('in_int', [], 'Int', None), 52 | ]) 53 | # Interge inherits from Object 54 | intc = Class("Int", "Object", [ 55 | Attr('variable', 'Int', Int(content=0)) 56 | ]) 57 | # String inherits from Object 58 | stringc = Class("String", "Object", [ 59 | Method('length', [], 'Int', None), 60 | Method('concat', [('arg', 'String')], 'String', None), 61 | Method( 62 | 'substr', [('arg1', 'Int'), ('arg2', 'Int')], 'String', None 63 | ), 64 | ]) 65 | # Boolean inherits from Object 66 | boolc = Class("Bool", "Object", [ 67 | Attr('variable', 'Bool', Bool(content=False)) 68 | ]) 69 | 70 | self.ast += [objc, ioc, intc, stringc, boolc] 71 | 72 | def __create_symbol_tables(self): 73 | """ 74 | Create two tables: 75 | One with all the classes and another with all 76 | parents classes. 77 | """ 78 | for _class in self.ast: 79 | if _class.name in self.classes: 80 | raise ClassAlreadyDefinedError(_class.name) 81 | 82 | else: 83 | self.classes[_class.name] = _class 84 | 85 | if _class.name != 'Object': 86 | self.parents[_class.parent].add(_class.name) 87 | 88 | def __check_undefined_classes(self): 89 | """ 90 | Check if every parent is defined in classes table. (self.classes) 91 | """ 92 | parents = self.parents.keys() 93 | 94 | for parent in parents: 95 | if parent not in self.classes: 96 | class_name = self.parents[parent] 97 | raise UndefinedParentError(class_name, parent) 98 | 99 | def __check_inheritance_cycles(self): 100 | """ 101 | Check if every class has your right parent and children. 102 | 103 | First, set every class(including parents) as False. 104 | Then, visit each class and their children. 105 | """ 106 | visited = {} 107 | for parent_name in self.parents.keys(): 108 | visited[parent_name] = False 109 | for child_name in self.parents[parent_name]: 110 | visited[child_name] = False 111 | 112 | # Visit every class, recursively, starting with Object 113 | self.__visit_tree('Object', visited) 114 | 115 | # If some class has False value, means that the visitor 116 | # couldn't get in that class. So, some class is missing. 117 | for key, value in visited.items(): 118 | if not value: 119 | raise InheritanceError(key) 120 | 121 | def __visit_tree(self, _class, visited): 122 | visited[_class] = True 123 | 124 | # If a _class is not in parents, 125 | # it is not a parent, so, don't have children. Get out. 126 | if _class not in self.parents.keys(): 127 | return 128 | 129 | for child in self.parents[_class]: 130 | self.__visit_tree(child, visited) 131 | 132 | def __check_inheritence_and_add_methods_in_children(self, _class='Object'): 133 | """ 134 | Check attributes and methods from inheritance and 135 | if it is ok, add them from parent to child. 136 | """ 137 | cl = self.classes[_class] 138 | 139 | if cl.parent: 140 | _class_parent = self.classes[cl.parent] 141 | 142 | attrs_of_parent = self.__get_attributes(_class_parent) 143 | attrs_of_child = self.__get_attributes(cl) 144 | 145 | self.__check_same_attribute( 146 | attrs_of_parent, attrs_of_child, _class 147 | ) 148 | 149 | methods_of_parent = self.__get_methods(_class_parent) 150 | methods_of_child = self.__get_methods(cl) 151 | 152 | method_signatures_of_parent = self.__get_signatures( 153 | methods_of_parent 154 | ) 155 | method_signatures_of_child = self.__get_signatures( 156 | methods_of_child 157 | ) 158 | 159 | self.__check_same_signature( 160 | methods_of_child, 161 | method_signatures_of_parent, 162 | method_signatures_of_child 163 | ) 164 | 165 | self.__add_method_from_parent_to_child( 166 | cl, methods_of_parent, methods_of_child 167 | ) 168 | 169 | self.__add_attr_from_parent_to_child(cl, attrs_of_parent) 170 | 171 | # Goes recursively to all children 172 | all_children = self.parents[_class] 173 | for child in all_children: 174 | self.__check_inheritence_and_add_methods_in_children(child) 175 | 176 | def __get_attributes(self, _class): 177 | return [i for i in _class.feature_list if isAttribute(i)] 178 | 179 | def __check_same_attribute(self, parent, child, _class): 180 | """ 181 | It's illegal to redefine attribute names in child class. 182 | """ 183 | for p_attr in parent: 184 | for c_attr in child: 185 | if p_attr.name == c_attr.name: 186 | raise RedefinedAttributeError(_class) 187 | 188 | def __get_methods(self, _class): 189 | return [i for i in _class.feature_list if isMethod(i)] 190 | 191 | def __get_signatures(self, methods): 192 | method_signatures = {} 193 | for method in methods: 194 | method_signatures[method.name] = {} 195 | for formal in method.formal_list: 196 | # formal is a tuple that has 2 values: 197 | # The first one is the name of the argument; 198 | # The second, is the type of the argument (Int, Bool,...) 199 | method_signatures[method.name][formal[0]] = formal[1] 200 | method_signatures[method.name]['return'] = method.return_type 201 | return method_signatures 202 | 203 | def __check_same_signature(self, child_methods, sig_parent, sig_child): 204 | """ 205 | If a class "B" inherits a method "m" from an ancestor class "A", 206 | then "B" may override the inherited definition of "m" provided 207 | the number of arguments, the types of the formal parameters, 208 | and the return type are exactly the same in both definitions. 209 | """ 210 | for method in child_methods: 211 | if method.name in sig_parent: 212 | parent_signature = sig_parent[method.name] 213 | child_signature = sig_child[method.name] 214 | 215 | if parent_signature != child_signature: 216 | raise RedefinedMethodError(method.name) 217 | 218 | def __add_method_from_parent_to_child(self, _cl, p_methods, c_methods): 219 | for method in p_methods: 220 | if method.name not in c_methods: 221 | copied_method = deepcopy(method) 222 | # Add at the beginning 223 | _cl.feature_list.insert(0, copied_method) 224 | 225 | def __add_attr_from_parent_to_child(self, _cl, attrs_of_parent): 226 | for attr in attrs_of_parent: 227 | # Add at the beginning 228 | _cl.feature_list.insert(0, deepcopy(attr)) 229 | 230 | def __check_scope_and_type(self, _class): 231 | """ 232 | Check scope and type for each class. 233 | 234 | If it's a method, goes recursively inside the body. 235 | 236 | When a scope is created? 237 | With a new block, let, case, 238 | 239 | OBS: Every attribute is protected and every method is public. 240 | """ 241 | 242 | for feature in _class.feature_list: 243 | _type = returned_type(feature, _class) 244 | 245 | if isAttribute(feature): 246 | value_type = get_expression_type( 247 | feature.body, _class, self.scope 248 | ) 249 | 250 | if not value_type: 251 | # If value_type is None, means that feature.body is 252 | # a complex expression, need to be checked. 253 | self.__check_children(feature.body, _class) 254 | 255 | # Test if the attribute value type is the same as declared. 256 | if feature.type != value_type: 257 | raise AttributeTypeError(feature, value_type) 258 | 259 | self.scope.add(feature.name, _type) 260 | 261 | elif isMethod(feature): 262 | self.scope.add(feature.name, _type) 263 | 264 | # Add arguments to scope. name:type 265 | for formal in feature.formal_list: 266 | self.scope.add(formal[0], formal[1]) 267 | 268 | self.__check_children(feature.body, _class) 269 | 270 | def __check_children(self, expression, _class): 271 | if isinstance(expression, Block): 272 | self.scope.new() 273 | 274 | for expr in expression.body: 275 | self.__check_children(expr, _class) 276 | 277 | self.scope.destroy() 278 | 279 | elif isinstance(expression, Dispatch): 280 | self.__check_children(expression.body, _class) 281 | 282 | # Get return type 283 | if expression.body == 'self': 284 | _class_name = _class.name 285 | else: 286 | try: 287 | _class_name = expression.body.return_type 288 | except AttributeError: 289 | # If the expression is an Object and there is no 290 | # return_type variable, so, need get the type. 291 | _class_name = get_expression_type( 292 | expression.body, _class, self.scope 293 | ) 294 | 295 | # Get the whole class' structure 296 | _class_content = self.classes[_class_name] 297 | 298 | called_method = False 299 | 300 | # Parse the structure untill match the method name 301 | for feature in _class_content.feature_list: 302 | if isMethod(feature) and feature.name == expression.method: 303 | called_method = True 304 | 305 | if len(feature.formal_list) != len(expression.expr_list): 306 | raise NumberOfArgumentError(feature.name, _class_name) 307 | 308 | formals = zip( 309 | feature.formal_list, expression.expr_list, 310 | ) 311 | 312 | # Test if the arguments types are not equals 313 | for feat, called in formals: 314 | expression_type = get_expression_type( 315 | called, _class, self.scope 316 | ) 317 | # feat[0] is the name and feat[1] the type 318 | if feat[1] != expression_type: 319 | raise ArgumentTypeError(feature, _class_name) 320 | 321 | # For default, the method returns the host class. SELF_TYPE 322 | last_type = _class_name 323 | 324 | feature_type = returned_type(feature, _class) 325 | 326 | # If exists a body, means that exists one or more 327 | # expressions inside the method. 328 | if feature.body: 329 | try: 330 | # If have a Block, must look the last expression, 331 | # because it is the type that will be returned. 332 | last_expression = feature.body.body[-1] 333 | except AttributeError: 334 | last_expression = feature.body 335 | 336 | last_type = get_expression_type( 337 | last_expression, _class, self.scope 338 | ) 339 | 340 | # If the returns types are not equals, raise an error 341 | if feature_type != last_type: 342 | raise ReturnedTypeError( 343 | feature.name, _class_name, feature_type, last_type 344 | ) 345 | 346 | # If didn't match the method name... 347 | if not called_method: 348 | raise UndefinedMethodError(expression.method, _class_name) 349 | 350 | elif isinstance(expression, Let): 351 | self.scope.new() 352 | self.scope.add(expression.object, expression.type) 353 | 354 | # Test if the declared type is the same type as 355 | # the given value 356 | value_type = get_expression_type( 357 | expression.init, _class, self.scope 358 | ) 359 | if expression.type != value_type: 360 | raise DeclaredTypeError(expression.type, value_type) 361 | 362 | self.__check_children(expression.body, _class) 363 | 364 | self.scope.destroy() 365 | 366 | elif isinstance(expression, While): 367 | self.__check_children(expression.predicate, _class) 368 | self.__check_children(expression.body, _class) 369 | # If the methods above did not raise an error, means that 370 | # the body's type is Int or an Object. 371 | # If is an Object and the root type is not a Bool, 372 | # must raise an error. 373 | self.__raise_if_not_bool(expression, _class, 'While') 374 | 375 | elif isinstance(expression, Lt) or isinstance(expression, Le): 376 | first_type, second_type = self.__get_params_types( 377 | expression, _class 378 | ) 379 | 380 | if first_type != 'Int' or second_type != 'Int': 381 | raise TypeCheckError(first_type, second_type, _class) 382 | 383 | elif isinstance(expression, Eq): 384 | """ 385 | The comparison = is a special case. 386 | If either or has static type Int, Bool, 387 | or String, then the other must have the same static type. 388 | """ 389 | first_type, second_type = self.__get_params_types( 390 | expression, _class 391 | ) 392 | types = ['String', 'Int', 'Bool'] 393 | if first_type not in types or second_type not in types: 394 | raise EqualTypeCheckError(first_type, second_type, _class) 395 | 396 | if first_type != second_type: 397 | raise EqualCheckError(first_type, second_type, _class) 398 | 399 | elif any(isinstance(expression, X) for X in [Plus, Sub, Mult, Div]): 400 | """ 401 | The static types of the two sub-expressions must be Int. 402 | 403 | Cool has only integer division. 404 | """ 405 | first_type, second_type = self.__get_params_types( 406 | expression, _class 407 | ) 408 | 409 | if first_type != 'Int' or second_type != 'Int': 410 | raise ArithmeticError(first_type, second_type, _class) 411 | 412 | elif isinstance(expression, Assign): 413 | self.__check_children(expression.body, _class) 414 | # If the method above did not raise an error, means that 415 | # the body type is Int. Just need to test name type now. 416 | name_type = get_expression_type( 417 | expression.name, _class, self.scope 418 | ) 419 | 420 | if name_type != 'Int': 421 | raise AssignError(name_type, 'Int', _class) 422 | 423 | elif isinstance(expression, If): 424 | self.__check_children(expression.predicate, _class) 425 | self.__check_children(expression.then_body, _class) 426 | self.__check_children(expression.else_body, _class) 427 | # If the methods above did not raise an error, means that 428 | # the body type is Int or an Object. 429 | # If is an Object and the root type is not a Bool, 430 | # must raise an error. 431 | self.__raise_if_not_bool(expression, _class, 'If') 432 | 433 | def __raise_if_not_bool(self, expression, _class, statement): 434 | if isinstance(expression.predicate, Object): 435 | obj_type = get_expression_type( 436 | expression.predicate, _class, self.scope 437 | ) 438 | if obj_type != 'Bool': 439 | raise ConditionStatementError(statement, obj_type, _class) 440 | 441 | def __get_params_types(self, expression, _class): 442 | first_type = get_expression_type( 443 | expression.first, _class, self.scope 444 | ) 445 | second_type = get_expression_type( 446 | expression.second, _class, self.scope 447 | ) 448 | return first_type, second_type 449 | -------------------------------------------------------------------------------- /static/css/bootstrap.min.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700");/*! 2 | * bootswatch v3.3.6 3 | * Homepage: http://bootswatch.com 4 | * Copyright 2012-2015 Thomas Park 5 | * Licensed under MIT 6 | * Based on Bootstrap 7 | *//*! 8 | * Bootstrap v3.3.6 (http://getbootstrap.com) 9 | * Copyright 2011-2015 Twitter, Inc. 10 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 11 | *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@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')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:1.846;color:#666666;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#2196f3;text-decoration:none}a:hover,a:focus{color:#0a6ebd;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:3px}.img-thumbnail{padding:4px;line-height:1.846;background-color:#ffffff;border:1px solid #dddddd;border-radius:3px;-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}.img-circle{border-radius:50%}hr{margin-top:23px;margin-bottom:23px;border:0;border-top:1px solid #eeeeee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:400;line-height:1.1;color:#444444}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#bbbbbb}h1,.h1,h2,.h2,h3,.h3{margin-top:23px;margin-bottom:11.5px}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%}h4,.h4,h5,.h5,h6,.h6{margin-top:11.5px;margin-bottom:11.5px}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%}h1,.h1{font-size:56px}h2,.h2{font-size:45px}h3,.h3{font-size:34px}h4,.h4{font-size:24px}h5,.h5{font-size:20px}h6,.h6{font-size:14px}p{margin:0 0 11.5px}.lead{margin-bottom:23px;font-size:14px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:19.5px}}small,.small{font-size:92%}mark,.mark{background-color:#ffe0b2;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#bbbbbb}.text-primary{color:#2196f3}a.text-primary:hover,a.text-primary:focus{color:#0c7cd5}.text-success{color:#4caf50}a.text-success:hover,a.text-success:focus{color:#3d8b40}.text-info{color:#9c27b0}a.text-info:hover,a.text-info:focus{color:#771e86}.text-warning{color:#ff9800}a.text-warning:hover,a.text-warning:focus{color:#cc7a00}.text-danger{color:#e51c23}a.text-danger:hover,a.text-danger:focus{color:#b9151b}.bg-primary{color:#fff;background-color:#2196f3}a.bg-primary:hover,a.bg-primary:focus{background-color:#0c7cd5}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#e1bee7}a.bg-info:hover,a.bg-info:focus{background-color:#d099d9}.bg-warning{background-color:#ffe0b2}a.bg-warning:hover,a.bg-warning:focus{background-color:#ffcb7f}.bg-danger{background-color:#f9bdbb}a.bg-danger:hover,a.bg-danger:focus{background-color:#f5908c}.page-header{padding-bottom:10.5px;margin:46px 0 23px;border-bottom:1px solid #eeeeee}ul,ol{margin-top:0;margin-bottom:11.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:23px}dt,dd{line-height:1.846}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #bbbbbb}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:11.5px 23px;margin:0 0 23px;font-size:16.25px;border-left:5px solid #eeeeee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.846;color:#bbbbbb}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:23px;font-style:normal;line-height:1.846}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:3px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:11px;margin:0 0 11.5px;font-size:12px;line-height:1.846;word-break:break-all;word-wrap:break-word;color:#212121;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:3px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.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-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.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-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.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-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#bbbbbb;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:23px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.846;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #dddddd}.table .table{background-color:#ffffff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#e1bee7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#d8abe0}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#ffe0b2}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#ffd699}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f9bdbb}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#f7a6a4}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:17.25px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:23px;font-size:19.5px;line-height:inherit;color:#212121;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:13px;line-height:1.846;color:#666666}.form-control{display:block;width:100%;height:37px;padding:6px 16px;font-size:13px;line-height:1.846;color:#666666;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-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}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#bbbbbb;opacity:1}.form-control:-ms-input-placeholder{color:#bbbbbb}.form-control::-webkit-input-placeholder{color:#bbbbbb}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:transparent;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@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:37px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.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"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.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"]{line-height:45px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:23px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:35px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:45px;padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}select.input-lg{height:45px;line-height:45px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:45px;padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}.form-group-lg select.form-control{height:45px;line-height:45px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:45px;min-height:40px;padding:11px 16px;font-size:17px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:46.25px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:37px;height:37px;line-height:37px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:45px;height:45px;line-height:45px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#4caf50}.has-success .form-control{border-color:#4caf50;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#3d8b40;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #92cf94;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #92cf94}.has-success .input-group-addon{color:#4caf50;border-color:#4caf50;background-color:#dff0d8}.has-success .form-control-feedback{color:#4caf50}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ff9800}.has-warning .form-control{border-color:#ff9800;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#cc7a00;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffc166;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffc166}.has-warning .input-group-addon{color:#ff9800;border-color:#ff9800;background-color:#ffe0b2}.has-warning .form-control-feedback{color:#ff9800}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#e51c23}.has-error .form-control{border-color:#e51c23;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#b9151b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ef787c;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ef787c}.has-error .input-group-addon{color:#e51c23;border-color:#e51c23;background-color:#f9bdbb}.has-error .form-control-feedback{color:#e51c23}.has-feedback label~.form-control-feedback{top:28px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#a6a6a6}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:30px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:17px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 16px;font-size:13px;line-height:1.846;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#444444;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#444444;background-color:#ffffff;border-color:transparent}.btn-default:focus,.btn-default.focus{color:#444444;background-color:#e6e6e6;border-color:rgba(0,0,0,0)}.btn-default:hover{color:#444444;background-color:#e6e6e6;border-color:rgba(0,0,0,0)}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#444444;background-color:#e6e6e6;border-color:rgba(0,0,0,0)}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#444444;background-color:#d4d4d4;border-color:rgba(0,0,0,0)}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#ffffff;border-color:transparent}.btn-default .badge{color:#ffffff;background-color:#444444}.btn-primary{color:#ffffff;background-color:#2196f3;border-color:transparent}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#0c7cd5;border-color:rgba(0,0,0,0)}.btn-primary:hover{color:#ffffff;background-color:#0c7cd5;border-color:rgba(0,0,0,0)}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#0c7cd5;border-color:rgba(0,0,0,0)}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#0a68b4;border-color:rgba(0,0,0,0)}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#2196f3;border-color:transparent}.btn-primary .badge{color:#2196f3;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#4caf50;border-color:transparent}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#3d8b40;border-color:rgba(0,0,0,0)}.btn-success:hover{color:#ffffff;background-color:#3d8b40;border-color:rgba(0,0,0,0)}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#3d8b40;border-color:rgba(0,0,0,0)}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#327334;border-color:rgba(0,0,0,0)}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#4caf50;border-color:transparent}.btn-success .badge{color:#4caf50;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#9c27b0;border-color:transparent}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#771e86;border-color:rgba(0,0,0,0)}.btn-info:hover{color:#ffffff;background-color:#771e86;border-color:rgba(0,0,0,0)}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#771e86;border-color:rgba(0,0,0,0)}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#5d1769;border-color:rgba(0,0,0,0)}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#9c27b0;border-color:transparent}.btn-info .badge{color:#9c27b0;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#ff9800;border-color:transparent}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#cc7a00;border-color:rgba(0,0,0,0)}.btn-warning:hover{color:#ffffff;background-color:#cc7a00;border-color:rgba(0,0,0,0)}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#cc7a00;border-color:rgba(0,0,0,0)}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#a86400;border-color:rgba(0,0,0,0)}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#ff9800;border-color:transparent}.btn-warning .badge{color:#ff9800;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#e51c23;border-color:transparent}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#b9151b;border-color:rgba(0,0,0,0)}.btn-danger:hover{color:#ffffff;background-color:#b9151b;border-color:rgba(0,0,0,0)}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#b9151b;border-color:rgba(0,0,0,0)}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#991216;border-color:rgba(0,0,0,0)}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#e51c23;border-color:transparent}.btn-danger .badge{color:#e51c23;background-color:#ffffff}.btn-link{color:#2196f3;font-weight:normal;border-radius:0}.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}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#0a6ebd;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#bbbbbb;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.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}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:13px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:3px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:10.5px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.846;color:#666666;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#141414;background-color:#eeeeee}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#2196f3}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#bbbbbb}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.846;color:#bbbbbb;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.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}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.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}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:3px;border-top-left-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.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}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.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}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}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 16px;font-size:13px;font-weight:normal;line-height:1;color:#666666;text-align:center;background-color:transparent;border:1px solid transparent;border-radius:3px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:17px;border-radius:3px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.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:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#bbbbbb}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#bbbbbb;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#2196f3}.nav .nav-divider{height:1px;margin:10.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid transparent}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.846;border:1px solid transparent;border-radius:3px 3px 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee transparent}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#666666;background-color:transparent;border:1px solid transparent;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:3px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid transparent}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid transparent;border-radius:3px 3px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:3px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#2196f3}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:3px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid transparent}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid transparent;border-radius:3px 3px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#ffffff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:64px;margin-bottom:23px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:3px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:20.5px 15px;font-size:17px;line-height:23px;height:64px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:15px;margin-bottom:15px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:3px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:10.25px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:23px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:23px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:20.5px;padding-bottom:20.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:13.5px;margin-bottom:13.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@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}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:3px;border-top-left-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:13.5px;margin-bottom:13.5px}.navbar-btn.btn-sm{margin-top:17px;margin-bottom:17px}.navbar-btn.btn-xs{margin-top:21px;margin-bottom:21px}.navbar-text{margin-top:20.5px;margin-bottom:20.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#ffffff;border-color:transparent}.navbar-default .navbar-brand{color:#666666}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#212121;background-color:transparent}.navbar-default .navbar-text{color:#bbbbbb}.navbar-default .navbar-nav>li>a{color:#666666}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#212121;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#212121;background-color:#eeeeee}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:transparent}.navbar-default .navbar-toggle .icon-bar{background-color:rgba(0,0,0,0.5)}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#eeeeee;color:#212121}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#666666}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#212121;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#212121;background-color:#eeeeee}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#666666}.navbar-default .navbar-link:hover{color:#212121}.navbar-default .btn-link{color:#666666}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#212121}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#2196f3;border-color:transparent}.navbar-inverse .navbar-brand{color:#b2dbfb}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-text{color:#bbbbbb}.navbar-inverse .navbar-nav>li>a{color:#b2dbfb}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#0c7cd5}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:transparent}.navbar-inverse .navbar-toggle .icon-bar{background-color:rgba(0,0,0,0.5)}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#0c84e4}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#0c7cd5;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#b2dbfb}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#0c7cd5}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444444;background-color:transparent}}.navbar-inverse .navbar-link{color:#b2dbfb}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#b2dbfb}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444444}.breadcrumb{padding:8px 15px;margin-bottom:23px;list-style:none;background-color:#f5f5f5;border-radius:3px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#cccccc}.breadcrumb>.active{color:#bbbbbb}.pagination{display:inline-block;padding-left:0;margin:23px 0;border-radius:3px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 16px;line-height:1.846;text-decoration:none;color:#2196f3;background-color:#ffffff;border:1px solid #dddddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#0a6ebd;background-color:#eeeeee;border-color:#dddddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#ffffff;background-color:#2196f3;border-color:#2196f3;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#bbbbbb;background-color:#ffffff;border-color:#dddddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:17px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:23px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#ffffff;border:1px solid #dddddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eeeeee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#bbbbbb;background-color:#ffffff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#bbbbbb}.label-default[href]:hover,.label-default[href]:focus{background-color:#a2a2a2}.label-primary{background-color:#2196f3}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#0c7cd5}.label-success{background-color:#4caf50}.label-success[href]:hover,.label-success[href]:focus{background-color:#3d8b40}.label-info{background-color:#9c27b0}.label-info[href]:hover,.label-info[href]:focus{background-color:#771e86}.label-warning{background-color:#ff9800}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#cc7a00}.label-danger{background-color:#e51c23}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#b9151b}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:normal;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#bbbbbb;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#2196f3;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#f9f9f9}.jumbotron h1,.jumbotron .h1{color:#444444}.jumbotron p{margin-bottom:15px;font-size:20px;font-weight:200}.jumbotron>hr{border-top-color:#e0e0e0}.container .jumbotron,.container-fluid .jumbotron{border-radius:3px;padding-left:15px;padding-right:15px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:59px}}.thumbnail{display:block;padding:4px;margin-bottom:23px;line-height:1.846;background-color:#ffffff;border:1px solid #dddddd;border-radius:3px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#2196f3}.thumbnail .caption{padding:9px;color:#666666}.alert{padding:15px;margin-bottom:23px;border:1px solid transparent;border-radius:3px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#4caf50}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#3d8b40}.alert-info{background-color:#e1bee7;border-color:#cba4dd;color:#9c27b0}.alert-info hr{border-top-color:#c191d6}.alert-info .alert-link{color:#771e86}.alert-warning{background-color:#ffe0b2;border-color:#ffc599;color:#ff9800}.alert-warning hr{border-top-color:#ffb67f}.alert-warning .alert-link{color:#cc7a00}.alert-danger{background-color:#f9bdbb;border-color:#f7a4af;color:#e51c23}.alert-danger hr{border-top-color:#f58c9a}.alert-danger .alert-link{color:#b9151b}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:23px;margin-bottom:23px;background-color:#f5f5f5;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:23px;color:#ffffff;text-align:center;background-color:#2196f3;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#4caf50}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#9c27b0}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#ff9800}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#e51c23}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}a.list-group-item,button.list-group-item{color:#555555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#bbbbbb;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#bbbbbb}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#2196f3;border-color:#2196f3}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e3f2fd}.list-group-item-success{color:#4caf50;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#4caf50}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#4caf50;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#4caf50;border-color:#4caf50}.list-group-item-info{color:#9c27b0;background-color:#e1bee7}a.list-group-item-info,button.list-group-item-info{color:#9c27b0}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#9c27b0;background-color:#d8abe0}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#9c27b0;border-color:#9c27b0}.list-group-item-warning{color:#ff9800;background-color:#ffe0b2}a.list-group-item-warning,button.list-group-item-warning{color:#ff9800}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#ff9800;background-color:#ffd699}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#ff9800;border-color:#ff9800}.list-group-item-danger{color:#e51c23;background-color:#f9bdbb}a.list-group-item-danger,button.list-group-item-danger{color:#e51c23}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#e51c23;background-color:#f7a6a4}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#e51c23;border-color:#e51c23}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:23px;background-color:#ffffff;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:2px;border-top-left-radius:2px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:15px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.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:2px;border-top-left-radius:2px}.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:2px;border-bottom-left-radius:2px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.panel>.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 td:first-child,.panel>.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 td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th: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 th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:2px}.panel>.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 td:last-child,.panel>.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 td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th: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 th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:2px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.panel>.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 td:first-child,.panel>.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 td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:2px}.panel>.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 td:last-child,.panel>.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 td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:2px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:23px}.panel-group .panel{margin-bottom:0;border-radius:3px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#212121;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#212121}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#2196f3}.panel-primary>.panel-heading{color:#ffffff;background-color:#2196f3;border-color:#2196f3}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#2196f3}.panel-primary>.panel-heading .badge{color:#2196f3;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#2196f3}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#ffffff;background-color:#4caf50;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#4caf50;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#cba4dd}.panel-info>.panel-heading{color:#ffffff;background-color:#9c27b0;border-color:#cba4dd}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#cba4dd}.panel-info>.panel-heading .badge{color:#9c27b0;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#cba4dd}.panel-warning{border-color:#ffc599}.panel-warning>.panel-heading{color:#ffffff;background-color:#ff9800;border-color:#ffc599}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ffc599}.panel-warning>.panel-heading .badge{color:#ff9800;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ffc599}.panel-danger{border-color:#f7a4af}.panel-danger>.panel-heading{color:#ffffff;background-color:#e51c23;border-color:#f7a4af}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f7a4af}.panel-danger>.panel-heading .badge{color:#e51c23;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f7a4af}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f9f9f9;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:3px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:19.5px;font-weight:normal;line-height:1;color:#000000;text-shadow:none;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.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;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid transparent}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.846}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid transparent}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.846;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#727272;border-radius:3px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#727272}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#727272}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#727272}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#727272}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#727272}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#727272}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#727272}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#727272}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.846;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:13px;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:13px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:2px 2px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:rgba(0,0,0,0);border-top-color:rgba(0,0,0,0.075);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:rgba(0,0,0,0);border-right-color:rgba(0,0,0,0.075)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,0);border-bottom-color:rgba(0,0,0,0.075);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:rgba(0,0,0,0);border-left-color:rgba(0,0,0,0.075)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.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}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);background-color:rgba(0,0,0,0)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.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}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-header:before,.modal-header:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-header:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{border:none;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.3);box-shadow:0 1px 2px rgba(0,0,0,0.3)}.navbar-brand{font-size:24px}.navbar-inverse .navbar-form input[type=text],.navbar-inverse .navbar-form input[type=password]{color:#fff;-webkit-box-shadow:inset 0 -1px 0 #b2dbfb;box-shadow:inset 0 -1px 0 #b2dbfb}.navbar-inverse .navbar-form input[type=text]::-moz-placeholder,.navbar-inverse .navbar-form input[type=password]::-moz-placeholder{color:#b2dbfb;opacity:1}.navbar-inverse .navbar-form input[type=text]:-ms-input-placeholder,.navbar-inverse .navbar-form input[type=password]:-ms-input-placeholder{color:#b2dbfb}.navbar-inverse .navbar-form input[type=text]::-webkit-input-placeholder,.navbar-inverse .navbar-form input[type=password]::-webkit-input-placeholder{color:#b2dbfb}.navbar-inverse .navbar-form input[type=text]:focus,.navbar-inverse .navbar-form input[type=password]:focus{-webkit-box-shadow:inset 0 -2px 0 #fff;box-shadow:inset 0 -2px 0 #fff}.btn-default{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-default:focus{background-color:#ffffff}.btn-default:hover,.btn-default:active:hover{background-color:#f0f0f0}.btn-default:active{background-color:#e0e0e0;background-image:-webkit-radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-image:-o-radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-image:radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-primary{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-primary:focus{background-color:#2196f3}.btn-primary:hover,.btn-primary:active:hover{background-color:#0d87e9}.btn-primary:active{background-color:#0b76cc;background-image:-webkit-radial-gradient(circle, #0b76cc 10%, #2196f3 11%);background-image:-o-radial-gradient(circle, #0b76cc 10%, #2196f3 11%);background-image:radial-gradient(circle, #0b76cc 10%, #2196f3 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-success{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-success:focus{background-color:#4caf50}.btn-success:hover,.btn-success:active:hover{background-color:#439a46}.btn-success:active{background-color:#39843c;background-image:-webkit-radial-gradient(circle, #39843c 10%, #4caf50 11%);background-image:-o-radial-gradient(circle, #39843c 10%, #4caf50 11%);background-image:radial-gradient(circle, #39843c 10%, #4caf50 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-info{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-info:focus{background-color:#9c27b0}.btn-info:hover,.btn-info:active:hover{background-color:#862197}.btn-info:active{background-color:#701c7e;background-image:-webkit-radial-gradient(circle, #701c7e 10%, #9c27b0 11%);background-image:-o-radial-gradient(circle, #701c7e 10%, #9c27b0 11%);background-image:radial-gradient(circle, #701c7e 10%, #9c27b0 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-warning{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-warning:focus{background-color:#ff9800}.btn-warning:hover,.btn-warning:active:hover{background-color:#e08600}.btn-warning:active{background-color:#c27400;background-image:-webkit-radial-gradient(circle, #c27400 10%, #ff9800 11%);background-image:-o-radial-gradient(circle, #c27400 10%, #ff9800 11%);background-image:radial-gradient(circle, #c27400 10%, #ff9800 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-danger{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-danger:focus{background-color:#e51c23}.btn-danger:hover,.btn-danger:active:hover{background-color:#cb171e}.btn-danger:active{background-color:#b0141a;background-image:-webkit-radial-gradient(circle, #b0141a 10%, #e51c23 11%);background-image:-o-radial-gradient(circle, #b0141a 10%, #e51c23 11%);background-image:radial-gradient(circle, #b0141a 10%, #e51c23 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-link{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-link:focus{background-color:#ffffff}.btn-link:hover,.btn-link:active:hover{background-color:#f0f0f0}.btn-link:active{background-color:#e0e0e0;background-image:-webkit-radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-image:-o-radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-image:radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn{text-transform:uppercase;border:none;-webkit-box-shadow:1px 1px 4px rgba(0,0,0,0.4);box-shadow:1px 1px 4px rgba(0,0,0,0.4);-webkit-transition:all 0.4s;-o-transition:all 0.4s;transition:all 0.4s}.btn-link{border-radius:3px;-webkit-box-shadow:none;box-shadow:none;color:#444444}.btn-link:hover,.btn-link:focus{-webkit-box-shadow:none;box-shadow:none;color:#444444;text-decoration:none}.btn-default.disabled{background-color:rgba(0,0,0,0.1);color:rgba(0,0,0,0.4);opacity:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:0}.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:0}body{-webkit-font-smoothing:antialiased;letter-spacing:.1px}p{margin:0 0 1em}input,button{-webkit-font-smoothing:antialiased;letter-spacing:.1px}a{-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}.table-hover>tbody>tr,.table-hover>tbody>tr>th,.table-hover>tbody>tr>td{-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}label{font-weight:normal}textarea,textarea.form-control,input.form-control,input[type=text],input[type=password],input[type=email],input[type=number],[type=text].form-control,[type=password].form-control,[type=email].form-control,[type=tel].form-control,[contenteditable].form-control{padding:0;border:none;border-radius:0;-webkit-appearance:none;-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd;font-size:16px}textarea:focus,textarea.form-control:focus,input.form-control:focus,input[type=text]:focus,input[type=password]:focus,input[type=email]:focus,input[type=number]:focus,[type=text].form-control:focus,[type=password].form-control:focus,[type=email].form-control:focus,[type=tel].form-control:focus,[contenteditable].form-control:focus{-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3}textarea[disabled],textarea.form-control[disabled],input.form-control[disabled],input[type=text][disabled],input[type=password][disabled],input[type=email][disabled],input[type=number][disabled],[type=text].form-control[disabled],[type=password].form-control[disabled],[type=email].form-control[disabled],[type=tel].form-control[disabled],[contenteditable].form-control[disabled],textarea[readonly],textarea.form-control[readonly],input.form-control[readonly],input[type=text][readonly],input[type=password][readonly],input[type=email][readonly],input[type=number][readonly],[type=text].form-control[readonly],[type=password].form-control[readonly],[type=email].form-control[readonly],[type=tel].form-control[readonly],[contenteditable].form-control[readonly]{-webkit-box-shadow:none;box-shadow:none;border-bottom:1px dotted #ddd}textarea.input-sm,textarea.form-control.input-sm,input.form-control.input-sm,input[type=text].input-sm,input[type=password].input-sm,input[type=email].input-sm,input[type=number].input-sm,[type=text].form-control.input-sm,[type=password].form-control.input-sm,[type=email].form-control.input-sm,[type=tel].form-control.input-sm,[contenteditable].form-control.input-sm{font-size:12px}textarea.input-lg,textarea.form-control.input-lg,input.form-control.input-lg,input[type=text].input-lg,input[type=password].input-lg,input[type=email].input-lg,input[type=number].input-lg,[type=text].form-control.input-lg,[type=password].form-control.input-lg,[type=email].form-control.input-lg,[type=tel].form-control.input-lg,[contenteditable].form-control.input-lg{font-size:17px}select,select.form-control{border:0;border-radius:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;padding-left:0;padding-right:0\9;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEVmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmaP/QSjAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=);-webkit-background-size:13px 13px;background-size:13px;background-repeat:no-repeat;background-position:right center;-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd;font-size:16px;line-height:1.5}select::-ms-expand,select.form-control::-ms-expand{display:none}select.input-sm,select.form-control.input-sm{font-size:12px}select.input-lg,select.form-control.input-lg{font-size:17px}select:focus,select.form-control:focus{-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEUhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF8S9ewAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=)}select[multiple],select.form-control[multiple]{background:none}.radio label,.radio-inline label,.checkbox label,.checkbox-inline label{padding-left:25px}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="radio"],.checkbox-inline input[type="radio"],.radio input[type="checkbox"],.radio-inline input[type="checkbox"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{margin-left:-25px}input[type="radio"],.radio input[type="radio"],.radio-inline input[type="radio"]{position:relative;margin-top:6px;margin-right:4px;vertical-align:top;border:none;background-color:transparent;-webkit-appearance:none;appearance:none;cursor:pointer}input[type="radio"]:focus,.radio input[type="radio"]:focus,.radio-inline input[type="radio"]:focus{outline:none}input[type="radio"]:before,.radio input[type="radio"]:before,.radio-inline input[type="radio"]:before,input[type="radio"]:after,.radio input[type="radio"]:after,.radio-inline input[type="radio"]:after{content:"";display:block;width:18px;height:18px;border-radius:50%;-webkit-transition:240ms;-o-transition:240ms;transition:240ms}input[type="radio"]:before,.radio input[type="radio"]:before,.radio-inline input[type="radio"]:before{position:absolute;left:0;top:-3px;background-color:#2196f3;-webkit-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0)}input[type="radio"]:after,.radio input[type="radio"]:after,.radio-inline input[type="radio"]:after{position:relative;top:-3px;border:2px solid #666666}input[type="radio"]:checked:before,.radio input[type="radio"]:checked:before,.radio-inline input[type="radio"]:checked:before{-webkit-transform:scale(.5);-ms-transform:scale(.5);-o-transform:scale(.5);transform:scale(.5)}input[type="radio"]:disabled:checked:before,.radio input[type="radio"]:disabled:checked:before,.radio-inline input[type="radio"]:disabled:checked:before{background-color:#bbbbbb}input[type="radio"]:checked:after,.radio input[type="radio"]:checked:after,.radio-inline input[type="radio"]:checked:after{border-color:#2196f3}input[type="radio"]:disabled:after,.radio input[type="radio"]:disabled:after,.radio-inline input[type="radio"]:disabled:after,input[type="radio"]:disabled:checked:after,.radio input[type="radio"]:disabled:checked:after,.radio-inline input[type="radio"]:disabled:checked:after{border-color:#bbbbbb}input[type="checkbox"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:relative;border:none;margin-bottom:-4px;-webkit-appearance:none;appearance:none;cursor:pointer}input[type="checkbox"]:focus,.checkbox input[type="checkbox"]:focus,.checkbox-inline input[type="checkbox"]:focus{outline:none}input[type="checkbox"]:focus:after,.checkbox input[type="checkbox"]:focus:after,.checkbox-inline input[type="checkbox"]:focus:after{border-color:#2196f3}input[type="checkbox"]:after,.checkbox input[type="checkbox"]:after,.checkbox-inline input[type="checkbox"]:after{content:"";display:block;width:18px;height:18px;margin-top:-2px;margin-right:5px;border:2px solid #666666;border-radius:2px;-webkit-transition:240ms;-o-transition:240ms;transition:240ms}input[type="checkbox"]:checked:before,.checkbox input[type="checkbox"]:checked:before,.checkbox-inline input[type="checkbox"]:checked:before{content:"";position:absolute;top:0;left:6px;display:table;width:6px;height:12px;border:2px solid #fff;border-top-width:0;border-left-width:0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}input[type="checkbox"]:checked:after,.checkbox input[type="checkbox"]:checked:after,.checkbox-inline input[type="checkbox"]:checked:after{background-color:#2196f3;border-color:#2196f3}input[type="checkbox"]:disabled:after,.checkbox input[type="checkbox"]:disabled:after,.checkbox-inline input[type="checkbox"]:disabled:after{border-color:#bbbbbb}input[type="checkbox"]:disabled:checked:after,.checkbox input[type="checkbox"]:disabled:checked:after,.checkbox-inline input[type="checkbox"]:disabled:checked:after{background-color:#bbbbbb;border-color:transparent}.has-warning input:not([type=checkbox]),.has-warning .form-control,.has-warning input.form-control[readonly],.has-warning input[type=text][readonly],.has-warning [type=text].form-control[readonly],.has-warning input:not([type=checkbox]):focus,.has-warning .form-control:focus{border-bottom:none;-webkit-box-shadow:inset 0 -2px 0 #ff9800;box-shadow:inset 0 -2px 0 #ff9800}.has-error input:not([type=checkbox]),.has-error .form-control,.has-error input.form-control[readonly],.has-error input[type=text][readonly],.has-error [type=text].form-control[readonly],.has-error input:not([type=checkbox]):focus,.has-error .form-control:focus{border-bottom:none;-webkit-box-shadow:inset 0 -2px 0 #e51c23;box-shadow:inset 0 -2px 0 #e51c23}.has-success input:not([type=checkbox]),.has-success .form-control,.has-success input.form-control[readonly],.has-success input[type=text][readonly],.has-success [type=text].form-control[readonly],.has-success input:not([type=checkbox]):focus,.has-success .form-control:focus{border-bottom:none;-webkit-box-shadow:inset 0 -2px 0 #4caf50;box-shadow:inset 0 -2px 0 #4caf50}.has-warning .input-group-addon,.has-error .input-group-addon,.has-success .input-group-addon{color:#666666;border-color:transparent;background-color:transparent}.nav-tabs>li>a,.nav-tabs>li>a:focus{margin-right:0;background-color:transparent;border:none;color:#666666;-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd;-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus:hover{background-color:transparent;-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3;color:#2196f3}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus{border:none;-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3;color:#2196f3}.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus:hover{border:none;color:#2196f3}.nav-tabs>li.disabled>a{-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd}.nav-tabs.nav-justified>li>a,.nav-tabs.nav-justified>li>a:hover,.nav-tabs.nav-justified>li>a:focus,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:none}.nav-tabs .dropdown-menu{margin-top:0}.dropdown-menu{margin-top:0;border:none;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.3);box-shadow:0 1px 4px rgba(0,0,0,0.3)}.alert{border:none;color:#fff}.alert-success{background-color:#4caf50}.alert-info{background-color:#9c27b0}.alert-warning{background-color:#ff9800}.alert-danger{background-color:#e51c23}.alert a:not(.close),.alert .alert-link{color:#fff;font-weight:bold}.alert .close{color:#fff}.badge{padding:4px 6px 4px}.progress{position:relative;z-index:1;height:6px;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress-bar:last-child{border-radius:0 3px 3px 0}.progress-bar:last-child:before{display:block;content:"";position:absolute;width:100%;height:100%;left:0;right:0;z-index:-1;background-color:#cae6fc}.progress-bar-success:last-child.progress-bar:before{background-color:#c7e7c8}.progress-bar-info:last-child.progress-bar:before{background-color:#edc9f3}.progress-bar-warning:last-child.progress-bar:before{background-color:#ffe0b3}.progress-bar-danger:last-child.progress-bar:before{background-color:#f28e92}.close{font-size:34px;font-weight:300;line-height:24px;opacity:0.6;-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}.close:hover{opacity:1}.list-group-item{padding:15px}.list-group-item-text{color:#bbbbbb}.well{border-radius:0;-webkit-box-shadow:none;box-shadow:none}.panel{border:none;border-radius:2px;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.3);box-shadow:0 1px 4px rgba(0,0,0,0.3)}.panel-heading{border-bottom:none}.panel-footer{border-top:none}.popover{border:none;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.3);box-shadow:0 1px 4px rgba(0,0,0,0.3)}.carousel-caption h1,.carousel-caption h2,.carousel-caption h3,.carousel-caption h4,.carousel-caption h5,.carousel-caption h6{color:inherit} --------------------------------------------------------------------------------