├── .gitattributes ├── .gitignore ├── README.md ├── auto_install ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ├── conf_file └── dhcpd.conf ├── manage.py ├── pxe ├── __init__.py ├── admin.py ├── forms.py ├── models.py ├── tests.py └── views.py ├── static └── boot │ ├── css │ ├── bootstrap-theme.css │ ├── bootstrap-theme.css.map │ ├── bootstrap-theme.min.css │ ├── bootstrap.css │ ├── bootstrap.css.map │ ├── bootstrap.min.css │ ├── jquery.dataTables.min.css │ ├── sco.message.css │ └── scojs.css │ ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ └── glyphicons-halflings-regular.woff │ ├── images │ ├── Sorting icons.psd │ ├── back_disabled.png │ ├── back_enabled.png │ ├── back_enabled_hover.png │ ├── edit.jpg │ ├── favicon.ico │ ├── forward_disabled.png │ ├── forward_enabled.png │ ├── forward_enabled_hover.png │ ├── info.jpg │ ├── jd.jpg │ ├── jt.jpg │ ├── jt_login.jpg │ ├── login.jpg │ ├── sort_asc.png │ ├── sort_asc_disabled.png │ ├── sort_both.png │ ├── sort_desc.png │ ├── sort_desc_disabled.png │ └── wancheng.jpg │ └── js │ ├── ajax.js │ ├── bootstrap.js │ ├── bootstrap.min.js │ ├── jquery.dataTables.min.js │ ├── jquery.js │ ├── jquery.min.map │ ├── npm.js │ ├── sco.confirm.js │ ├── sco.message.js │ ├── sco.modal.js │ └── sco.valid.js ├── templates ├── base.html ├── edit.html ├── exe.html ├── export.html ├── find.html ├── his.html ├── info.html ├── install.html ├── ks │ ├── conf.cfg │ └── webserver.cfg └── login.html └── tools ├── auto_install.sh ├── index.py ├── init.sql ├── letv-live.ks └── post.sh /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | # C extensions 5 | *.so 6 | migrations/ 7 | # Distribution / packaging 8 | .Python 9 | .svn/ 10 | env/ 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | eggs/ 15 | lib/ 16 | lib64/ 17 | parts/ 18 | sdist/ 19 | var/ 20 | *.egg-info/ 21 | .installed.cfg 22 | *.egg 23 | 24 | # PyInstaller 25 | # Usually these files are written by a python script from a template 26 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 27 | *.manifest 28 | *.spec 29 | 30 | # Installer logs 31 | pip-log.txt 32 | pip-delete-this-directory.txt 33 | 34 | # Unit test / coverage reports 35 | htmlcov/ 36 | .tox/ 37 | .coverage 38 | .cache 39 | nosetests.xml 40 | coverage.xml 41 | 42 | # Translations 43 | *.mo 44 | *.pot 45 | 46 | # Django stuff: 47 | *.log 48 | 49 | # Sphinx documentation 50 | docs/_build/ 51 | 52 | # PyBuilder 53 | target/ 54 | 55 | # ========================= 56 | # Operating System Files 57 | # ========================= 58 | 59 | # OSX 60 | # ========================= 61 | 62 | .DS_Store 63 | .AppleDouble 64 | .LSOverride 65 | 66 | # Icon must end with two \r 67 | Icon 68 | 69 | # Thumbnails 70 | ._* 71 | 72 | # Files that might appear on external disk 73 | .Spotlight-V100 74 | .Trashes 75 | 76 | # Directories potentially created on remote AFP share 77 | .AppleDB 78 | .AppleDesktop 79 | Network Trash Folder 80 | Temporary Items 81 | .apdisk 82 | 83 | # Windows 84 | # ========================= 85 | 86 | # Windows image file caches 87 | Thumbs.db 88 | ehthumbs.db 89 | 90 | # Folder config file 91 | Desktop.ini 92 | 93 | # Recycle Bin used on file shares 94 | $RECYCLE.BIN/ 95 | 96 | # Windows Installer files 97 | *.cab 98 | *.msi 99 | *.msm 100 | *.msp 101 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | auto_install 2 | ============ 3 | 4 | 自动装机系统,可以配置ILO,RAID,通过PXE启动,自动发现机器添加到装机系统中,目前执行机型,DELL,IBM,浪潮,华为 ,HP 5 | ----------------- 6 | 依赖组件 7 | * python 1.7+ 8 | * Django 1.7 9 | * request 10 | * python-memcached 11 | * mysql-python 12 | 13 | ------------------ 14 | 目录结构 15 | 16 | auto_install/ 17 | ├── auto_install 18 | │   ├── __init__.py 19 | │   ├── settings.py 20 | │   ├── urls.py 21 | │   └── wsgi.py 22 | ├── conf_file 23 | ├── manage.py 24 | ├── pxe 25 | │   ├── admin.py 26 | │   ├── forms.py 27 | │   ├── __init__.py 28 | │   ├── models.py 29 | │   ├── tests.py 30 | │   └── views.py 31 | ├── static 32 | │   ├── boot 33 | │   │   ├── css 34 | │   │   │   ├── bootstrap.css 35 | │   │   │   ├── bootstrap.min.css 36 | │   │   │   ├── bootstrap-theme.css 37 | │   │   │   ├── bootstrap-theme.min.css 38 | │   │   │   ├── scojs.css 39 | │   │   │   └── sco.message.css 40 | │   │   ├── fonts 41 | │   │   └── js 42 | │   │   ├── ajax.js 43 | │   │   ├── bootstrap.js 44 | │   │   ├── bootstrap.min.js 45 | │   │   ├── jquery.js 46 | │   │   ├── npm.js 47 | │   │   ├── sco.confirm.js 48 | │   │   ├── sco.modal.js 49 | │   │   └── sco.valid.js 50 | │   └── images 51 | ├── templates 52 | │   ├── base.html 53 | │   ├── edit.html 54 | │   ├── exe.html 55 | │   ├── find.html 56 | │   ├── his.html 57 | │   ├── info.html 58 | │   ├── install.html 59 | │   ├── ks 60 | │   │   ├── conf.cfg 61 | │   │   └── webserver.cfg 62 | │   └── login.html 63 | └── tools 64 | ├── auto_install.sh 65 | ├── index.py 66 | └── post.sh 67 | ![截图](https://raw.githubusercontent.com/gaoming655/auto_install/master/static/boot/images/jt_login.jpg) 68 | 69 | ![截图](https://raw.githubusercontent.com/gaoming655/auto_install/master/static/boot/images/jt.jpg) 70 | 71 | ![截图](https://raw.githubusercontent.com/gaoming655/auto_install/master/static/boot/images/info.jpg) 72 | 73 | ![截图](https://raw.githubusercontent.com/gaoming655/auto_install/master/static/boot/images/edit.jpg) 74 | 75 | ![截图](https://raw.githubusercontent.com/gaoming655/auto_install/master/static/boot/images/jd.jpg) 76 | 77 | ![截图](https://raw.githubusercontent.com/gaoming655/auto_install/master/static/boot/images/wancheng.jpg) 78 | -------------------------------------------------------------------------------- /auto_install/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/auto_install/__init__.py -------------------------------------------------------------------------------- /auto_install/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for auto_install project. 3 | 4 | For more information on this file, see 5 | https://docs.djangoproject.com/en/1.7/topics/settings/ 6 | 7 | For the full list of settings and their values, see 8 | https://docs.djangoproject.com/en/1.7/ref/settings/ 9 | """ 10 | 11 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 12 | import os 13 | BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 14 | 15 | # Edit your server_ip and content_ip [ip:port] 16 | server_ip = "192.168.211.1" 17 | 18 | content_ip = "192.168.211.2" 19 | 20 | # Quick-start development settings - unsuitable for production 21 | # See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/ 22 | 23 | # SECURITY WARNING: keep the secret key used in production secret! 24 | # The secret_key value is "123456" 25 | SECRET_KEY = 'a#o7z=eg(8_zj5cwxp1!25+)_-4673t+$ian7w&xnp%6izd9=2' 26 | 27 | # SECURITY WARNING: don't run with debug turned on in production! 28 | DEBUG = True 29 | 30 | TEMPLATE_DEBUG = True 31 | 32 | ALLOWED_HOSTS = [] 33 | 34 | 35 | # Application definition 36 | 37 | INSTALLED_APPS = ( 38 | 'django.contrib.admin', 39 | 'django.contrib.auth', 40 | 'django.contrib.contenttypes', 41 | 'django.contrib.sessions', 42 | 'django.contrib.messages', 43 | 'django.contrib.staticfiles', 44 | 'pxe', 45 | ) 46 | 47 | MIDDLEWARE_CLASSES = ( 48 | 'django.contrib.sessions.middleware.SessionMiddleware', 49 | 'django.middleware.common.CommonMiddleware', 50 | 'django.middleware.csrf.CsrfViewMiddleware', 51 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 52 | 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 53 | 'django.contrib.messages.middleware.MessageMiddleware', 54 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 55 | 'django.middleware.locale.LocaleMiddleware', 56 | ) 57 | FILE_UPLOAD_HANDLERS = ( 58 | "django.core.files.uploadhandler.MemoryFileUploadHandler", 59 | "django.core.files.uploadhandler.TemporaryFileUploadHandler" 60 | ) 61 | FILE_UPLOAD_MAX_MEMORY_SIZE = 5242880 62 | ROOT_URLCONF = 'auto_install.urls' 63 | 64 | WSGI_APPLICATION = 'auto_install.wsgi.application' 65 | 66 | 67 | # Database 68 | # https://docs.djangoproject.com/en/1.7/ref/settings/#databases 69 | 70 | DATABASES = { 71 | 'default': { 72 | 'ENGINE': 'django.db.backends.mysql', 73 | 'NAME': 'pxe', 74 | 'USER':'root', 75 | 'PASSWORD':'1234', 76 | 'HOST':'localhost', 77 | 'PORT':'3306', 78 | } 79 | } 80 | 81 | # Internationalization 82 | # https://docs.djangoproject.com/en/1.7/topics/i18n/ 83 | 84 | LANGUAGE_CODE = 'en-us' 85 | 86 | TIME_ZONE = 'Asia/Shanghai' 87 | 88 | USE_I18N = True 89 | 90 | USE_L10N = True 91 | 92 | USE_TZ = True 93 | 94 | # add memcached 95 | CACHES = { 96 | 'default': { 97 | 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 98 | 'LOCATION': '127.0.0.1:11211', 99 | } 100 | } 101 | 102 | # Static files (CSS, JavaScript, Images) 103 | # https://docs.djangoproject.com/en/1.7/howto/static-files/ 104 | #STATIC_ROOT = os.path.join(os.path.dirname(__file__), '../static').replace('\\','/') 105 | 106 | STATIC_URL = '/static/' 107 | 108 | STATICFILES_DIRS = ( 109 | os.path.join(os.path.dirname(__file__), '../static').replace('\\','/'), 110 | # Put strings here, like "/home/html/static" or "C:/www/django/static". 111 | # Always use forward slashes, even on Windows. 112 | # Don't forget to use absolute paths, not relative paths. 113 | ) 114 | TEMPLATE_DIRS = ( 115 | os.path.join(os.path.dirname(__file__), '../templates').replace('\\','/'), 116 | ) -------------------------------------------------------------------------------- /auto_install/urls.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | from django.conf.urls import patterns, include, url 3 | from django.contrib import admin 4 | from pxe.views import * 5 | from django.views.generic.base import RedirectView 6 | from django.conf import settings 7 | admin.autodiscover() 8 | urlpatterns = patterns('', 9 | # Examples: 10 | # url(r'^$', 'auto_install.views.home', name='home'), 11 | # url(r'^blog/', include('blog.urls')), 12 | url(r'^start/(\d+)',start), 13 | url(r'^batch_install/$',batch_install,name="batch_install"), 14 | url(r'^online/(?P\d+)',online_view), 15 | url(r'^edit/(?P\d+)',edit,name="edit"), 16 | url(r'^info/(\d+)', info, name='info'), 17 | url(r'^exe/',exe_page,name="exe"), 18 | url(r'^$', login_view,name='login'), 19 | url(r'^find/',find_page,name='find'), 20 | url(r'^logout/', logout_page, name="logout"), 21 | url(r'^del/(\d+)',del_obj), 22 | url(r'^lock/(?P\d+)/(?PTrue|False)',lock_obj), 23 | url(r'^post/',register_post), 24 | url(r'^jindu_post/(?P\d+)',jindu_post), 25 | url(r'^jindu_get/(?P\d+)',get_jindu_from_cache), 26 | url(r'^his/',his_page,name="his"), 27 | url(r'^finish/',finish_api), 28 | url(r'^delivery/(?P\d+)',delivery), 29 | url(r'^batch_delivery/$',batch_delivery,name='batch_delivery'), 30 | url(r'^ping/(?P\d+)',ping,name='ping'), 31 | url(r'^piliang/$',piliang,name="piliang"), 32 | url(r'^export_ip/$',export_ip,name="export_ip"), 33 | url(r'^upload/$',upload_file,name='upload'), 34 | url(r'^commit/$',auto_commit,name='commit'), 35 | url(r'^admin/', include(admin.site.urls)), 36 | ) 37 | 38 | # ks file download 39 | urlpatterns += patterns('', 40 | url(r'^ks/(?P\d+)',kickstart_file_url), 41 | ) 42 | 43 | # Api file download for memos 44 | urlpatterns += patterns('', 45 | url(r'^(?Pauto_install.sh|index.py|post.sh|autocommit.csv)',download_file,name="download"), 46 | ) -------------------------------------------------------------------------------- /auto_install/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for auto_install project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "auto_install.settings") 12 | 13 | from django.core.wsgi import get_wsgi_application 14 | application = get_wsgi_application() 15 | -------------------------------------------------------------------------------- /conf_file/dhcpd.conf: -------------------------------------------------------------------------------- 1 | # ****************************************************************** 2 | # Cobbler managed dhcpd.conf file 3 | # generated from cobbler dhcp.conf template (Tue Dec 9 08:46:48 2014) 4 | # Do NOT make changes to /etc/dhcpd.conf. Instead, make your changes 5 | # in /etc/cobbler/dhcp.template, as /etc/dhcpd.conf will be 6 | # overwritten. 7 | # ****************************************************************** 8 | 9 | ddns-update-style interim; 10 | 11 | allow booting; 12 | allow bootp; 13 | 14 | ignore client-updates; 15 | set vendorclass = option vendor-class-identifier; 16 | 17 | option pxe-system-type code 93 = unsigned integer 16; 18 | 19 | subnet 192.168.211.0 netmask 255.255.255.0 { 20 | option subnet-mask 255.255.255.0; 21 | range dynamic-bootp 192.168.211.10 192.168.211.251; 22 | default-lease-time 21600; 23 | max-lease-time 43200; 24 | next-server 192.168.211.1; 25 | class "pxeclients" { 26 | match if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; 27 | if option pxe-system-type = 00:02 { 28 | filename "ia64/elilo.efi"; 29 | } else if option pxe-system-type = 00:06 { 30 | filename "grub/grub-x86.efi"; 31 | } else if option pxe-system-type = 00:07 { 32 | filename "grub/grub-x86_64.efi"; 33 | } else { 34 | filename "pxelinux.0"; 35 | } 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | from auto_install.settings import server_ip,content_ip 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "auto_install.settings") 7 | 8 | if not server_ip and not content_ip: 9 | print "server ip or content ip is empty in settings.py!!" 10 | sys.exit(211) 11 | 12 | from django.core.management import execute_from_command_line 13 | 14 | execute_from_command_line(sys.argv) 15 | -------------------------------------------------------------------------------- /pxe/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/pxe/__init__.py -------------------------------------------------------------------------------- /pxe/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from models import * 3 | 4 | # Register your models here. 5 | 6 | 7 | 8 | class Install_admin(admin.ModelAdmin): 9 | list_display=('id','ipaddr','inc','sn','status') 10 | 11 | class Online_admin(admin.ModelAdmin): 12 | list_display = ('id','ip','level','ilo_ip','status','inc','sn') 13 | 14 | class disk_sotl_admin(admin.ModelAdmin): 15 | list_display = ('sotl','size','host_id') 16 | 17 | admin.site.register(install,Install_admin) 18 | admin.site.register(online,Online_admin) 19 | admin.site.register(disk_sotl,disk_sotl_admin) -------------------------------------------------------------------------------- /pxe/forms.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | from django import forms 3 | from models import * 4 | from django.utils.translation import ugettext_lazy as _ 5 | 6 | 7 | class login_form(forms.Form): 8 | username = forms.CharField(max_length=30,widget=forms.TextInput(attrs={'class':'form-control','placeholder':'Username: '})) 9 | passwd = forms.CharField(widget=forms.PasswordInput(attrs={'class':'form-control','placeholder':'Password: '})) 10 | 11 | 12 | class edit_form(forms.ModelForm): 13 | class Meta: 14 | model = online 15 | fields = ('ilo_ip','ilo_netmask','ilo_gw','level','kickstart','stripe','service_ip','service_netmask','service_gw','eth') 16 | widgets ={ 17 | 'ilo_ip':forms.TextInput(attrs={'class':'form-control'}), 18 | 'service_ip':forms.TextInput(attrs={'class':'form-control'}), 19 | 'service_gw':forms.TextInput(attrs={'class':'form-control'}), 20 | 'ilo_gw':forms.TextInput(attrs={'class':'form-control'}), 21 | } 22 | error_messages = { 23 | 'ilo_ip': { 24 | 'invalid':_("IP地址格式不正确"), 25 | } 26 | } -------------------------------------------------------------------------------- /pxe/models.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | from django.db import models 3 | import datetime 4 | # Create your models here. 5 | raid_chose = ((False,'不可安装'),(True,'可安装')) 6 | ETH = (('eth0','eth0'),('eth1','eth1')) 7 | raid_level = ((1,'raid1'),(0,'raid0'),(5,'raid5')) 8 | ks_choices = (('conf','测试ks勿安装'),('webserver','webserver')) 9 | stripe_choices = ((1024,'1M'),(512,'512K'),(128,'128K'),(64,'64K')) 10 | netmask=(("255.255.0.0","255.255.0.0"),("255.255.255.0","255.255.255.0"),('255.255.255.128','255.255.255.128'),('255.255.255.192','255.255.255.192'),('255.255.255.224','255.255.255.224'),('255.255.255.240','255.255.255.240')) 11 | class disk_sotl(models.Model): 12 | sotl = models.CharField(max_length=20) 13 | size = models.CharField(max_length=20) 14 | host_id = models.IntegerField(max_length=10,) 15 | 16 | class install(models.Model): 17 | inc = models.CharField(max_length=30) 18 | ilo_ip = models.IPAddressField(null=True,blank=True) 19 | ilo_netmask = models.IPAddressField(null=True,blank=True) 20 | ilo_gw = models.IPAddressField(null=True,blank=True) 21 | ipaddr = models.IPAddressField() 22 | sn = models.CharField(max_length=100,unique=True) 23 | status = models.BooleanField(default=True,choices=raid_chose) 24 | day = models.DateField(default=datetime.datetime.now()) 25 | cpu = models.CharField(max_length=100,) 26 | mem = models.CharField(max_length=20,) 27 | sotl = models.CharField(max_length=5) 28 | ksdev = models.CharField(max_length=10) 29 | def __unicode__(self): 30 | return "%s " % self.ipaddr 31 | class online(models.Model): 32 | level = models.IntegerField(max_length=2,choices=raid_level,blank=False,default=1) 33 | ip = models.IPAddressField() 34 | service_ip = models.IPAddressField(null=True,blank=True) 35 | service_netmask = models.CharField(max_length=30,choices=netmask,default="255.255.255.0",blank=False) 36 | service_gw = models.IPAddressField(null=True,blank=True) 37 | ilo_ip = models.IPAddressField(null=True,blank=True) 38 | ilo_netmask = models.CharField(max_length=30,choices=netmask,default="255.255.0.0",blank=False,null=True) 39 | ilo_gw = models.IPAddressField(null=True,blank=True) 40 | status = models.BooleanField(default=False) 41 | inc = models.CharField(max_length=30) 42 | sn = models.CharField(max_length=100,unique=True) 43 | sotl_total = models.IntegerField(max_length=3) 44 | stripe = models.IntegerField(max_length=10,default='1024',blank=False,choices=stripe_choices) 45 | raid_zh = models.CharField(max_length=200,) 46 | kickstart = models.CharField(max_length=30,blank=False,default='webserver',choices=ks_choices) 47 | finish_status = models.BooleanField(default=False) 48 | jindu = models.IntegerField(max_length=3,default=0) 49 | eth = models.CharField(max_length=10,choices=ETH,default='eth0',blank=False) 50 | ssh_status = models.BooleanField(default=False) 51 | ksdev = models.CharField(max_length=10) 52 | def __unicode__(self): 53 | return "%s" % self.ip 54 | 55 | class ilo_table(models.Model): 56 | maunfacturer = models.CharField(max_length=100,) 57 | lan_num = models.IntegerField(max_length=10,) 58 | def __unicode__(self): 59 | return "%s" % self.maunfacturer -------------------------------------------------------------------------------- /pxe/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /pxe/views.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | #version 2.2.3 3 | #made by G.M 4 | #date : 2013-10-29 5 | from django.shortcuts import render,get_object_or_404 6 | from django.http import HttpResponse,Http404,HttpResponseRedirect 7 | from django.contrib.auth import login,logout,authenticate 8 | from forms import * 9 | from django.core.cache import cache 10 | from auto_install.settings import server_ip,content_ip 11 | from django.contrib.auth.decorators import login_required 12 | import requests 13 | import json 14 | from django.views.decorators.csrf import csrf_exempt 15 | import csv 16 | import os 17 | import re 18 | import socket 19 | import platform 20 | import time 21 | import threading 22 | # Create your views here. 23 | 24 | # Validation IP address is True 25 | rc = re.compile(r'^((?:(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[0-9]{1,2}))\.){3}(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[0-9]{1,2})))$') 26 | rr = re.compile(r'.*\.csv$') 27 | csv_first_line = ['Serial Number ','Raid Level(1,0,5)','Strip(KB)','Disk list','Remote management IP','Remote management Netmask','Remote management Gateway','Productive Ip','Productive Netmask','Productive Gateway','System name','Interface'] 28 | _sep = os.sep 29 | def login_view(request): 30 | """用户登录认证""" 31 | if request.method == 'POST': 32 | usr = authenticate(username = request.POST['username'],password = request.POST['passwd']) 33 | if usr is not None: 34 | if usr.is_active: 35 | login(request, usr) 36 | return HttpResponseRedirect('/find/') 37 | else: 38 | raise Http404 39 | else: 40 | raise Http404 41 | else: 42 | f = login_form() 43 | return render(request,'login.html',{'forms':f}) 44 | 45 | def logout_page(request): 46 | """注销用户""" 47 | logout(request) 48 | return HttpResponseRedirect("/") 49 | #---------------------------------------------------------------------- 50 | 51 | @login_required(login_url="/") 52 | def find_page(request): 53 | """发现主机""" 54 | if request.method == "GET": 55 | all_data = install.objects.all() 56 | total = all_data.count() 57 | his_num = online.objects.filter(finish_status=True).count() 58 | on_total = online.objects.filter(finish_status=False).count() 59 | return render(request,'find.html',{'forms':all_data, "total":total, "on_total":on_total,"index":"find","his_num":his_num}) 60 | 61 | @login_required(login_url="/") 62 | def info(request,info_id): 63 | """主机详情""" 64 | if request.method == "GET": 65 | machine_info = install.objects.get(id = int(info_id)) 66 | disk_list = disk_sotl.objects.filter(host_id=int(info_id)) 67 | return render(request,"info.html",{"forms":machine_info,'dd': disk_list}) 68 | 69 | #---------------------------------------------------------------------- 70 | @login_required(login_url="/") 71 | def exe_page(request): 72 | """装机队列页面""" 73 | if request.method == 'GET': 74 | dict_status = {} 75 | f = online.objects.filter(finish_status=False) 76 | for i in f.values_list(): 77 | key = i[0] 78 | status_key = "%s_status" % key 79 | status_num = cache.get(status_key,None) 80 | if not status_num: 81 | pass 82 | else: 83 | dict_status[key] = status_num 84 | on_total = f.count() 85 | his_num = online.objects.filter(finish_status=True).count() 86 | total = install.objects.all().count() 87 | return render(request,"exe.html",{'forms':f,"total":total, "on_total":on_total,"index":"exe","his_num":his_num,"num":dict_status}) 88 | 89 | @login_required(login_url="/") 90 | def start(request,echo_id): 91 | """点击安装""" 92 | if request.method == 'GET': 93 | d = online.objects.get(id=int(echo_id)) 94 | if d.status: 95 | return HttpResponse(json.dumps({'code':100})) 96 | lv = d.level 97 | ip = d.ip 98 | disk = d.raid_zh 99 | ks = d.kickstart 100 | tiaodai = d.stripe 101 | ilo_ip = d.ilo_ip 102 | ilo_netmask = d.ilo_netmask 103 | ilo_gw = d.ilo_gw 104 | inc = d.inc 105 | s_ip = d.service_ip 106 | nk = d.service_netmask 107 | gw = d.service_gw 108 | ksdev = d.ksdev 109 | ilo_list = ilo_table.objects.values('maunfacturer').iterator() 110 | reboot_url = "http://%s/reboot" % ip 111 | status_key = "%s_status" % echo_id 112 | for i in ilo_list: 113 | if i['maunfacturer'] in inc: 114 | get_pintan = ilo_table.objects.get(maunfacturer=i['maunfacturer']) 115 | lan = get_pintan.lan_num 116 | break 117 | raid_url = "http://%s/raid?lv=%s&disk=%s&tiaodai=%s&ks=%s&ksdev=%s&ilo_ip=%s&lan=%s&ilo_netmask=%s&ilo_gw=%s" % (ip,lv,disk,tiaodai,echo_id,ksdev,ilo_ip,lan,ilo_netmask,ilo_gw) 118 | try: 119 | q = requests.get(raid_url) 120 | except: 121 | cache.set(status_key,1,864000) 122 | return HttpResponse(json.dumps({'code':2})) 123 | d.status=True 124 | d.save() 125 | j = json.loads(q.text) 126 | if j['code'] == 0: 127 | requests.get(reboot_url) 128 | key = "%s_ip" % echo_id 129 | cache.set(key,s_ip,864000) 130 | return HttpResponse(json.dumps({'code':0})) 131 | else: 132 | cache.set(status_key,1,864000) 133 | d.status=False 134 | d.save() 135 | return HttpResponse(json.dumps({'code':1})) 136 | 137 | 138 | 139 | def mythread_install(get_id): 140 | d = online.objects.get(id=int(get_id)) 141 | if d.status: 142 | return True 143 | lv = d.level 144 | ip = d.ip 145 | disk = d.raid_zh 146 | ks = d.kickstart 147 | tiaodai = d.stripe 148 | ilo_ip = d.ilo_ip 149 | ilo_netmask = d.ilo_netmask 150 | ilo_gw = d.ilo_gw 151 | inc = d.inc 152 | s_ip = d.service_ip 153 | nk = d.service_netmask 154 | gw = d.service_gw 155 | ksdev = d.ksdev 156 | ilo_list = ilo_table.objects.values('maunfacturer').iterator() 157 | reboot_url = "http://%s/reboot" % ip 158 | for i in ilo_list: 159 | if i['maunfacturer'] in inc: 160 | get_pintan = ilo_table.objects.get(maunfacturer=i['maunfacturer']) 161 | lan = get_pintan.lan_num 162 | break 163 | raid_url = "http://%s/raid?lv=%s&disk=%s&tiaodai=%s&ks=%s&ksdev=%s&ilo_ip=%s&lan=%s&ilo_netmask=%s&ilo_gw=%s" % (ip,lv,disk,tiaodai,get_id,ksdev,ilo_ip,lan,ilo_netmask,ilo_gw) 164 | status_key = "%s_status" % get_id 165 | try: 166 | q = requests.get(raid_url) 167 | except: 168 | cache.set(status_key,1,864000) 169 | return True 170 | d.status=True 171 | d.save() 172 | j = json.loads(q.text) 173 | if j['code'] == 0: 174 | requests.get(reboot_url) 175 | key = "%s_ip" % get_id 176 | cache.set(key,s_ip,864000) 177 | return True 178 | else: 179 | d.status=False 180 | d.save() 181 | cache.set(status_key,1,864000) 182 | return True 183 | 184 | 185 | @login_required(login_url="/") 186 | def batch_install(request): 187 | """批量点击安装""" 188 | if request.method == "POST": 189 | get_id_list = request.POST.get('install_list') 190 | get_id_list = get_id_list.replace(',',' ').strip().split() 191 | l = [] 192 | for i in get_id_list: 193 | i = threading.Thread(target=mythread_install,args=(i,)) 194 | l.append(i) 195 | for o in l: 196 | o.start() 197 | for q in l: 198 | q.join() 199 | return HttpResponse(json.dumps({'code':0})) 200 | 201 | 202 | @login_required(login_url="/") 203 | def del_obj(request,obj_id): 204 | """删除误重启的机器""" 205 | if request.method == "GET": 206 | obj = install.objects.get(id=int(obj_id)).delete() 207 | disk_sotl.objects.filter(host_id=int(obj_id)).delete() 208 | return HttpResponseRedirect('/find/') 209 | @login_required(login_url="/") 210 | def lock_obj(request,obj_id,obj_code): 211 | """锁定机器""" 212 | if request.method == "GET": 213 | if eval(obj_code): 214 | install.objects.filter(id=int(obj_id)).update(status=False) 215 | else: 216 | install.objects.filter(id=int(obj_id)).update(status=True) 217 | return HttpResponseRedirect('/find/') 218 | 219 | def push_install_mq(obj_id): 220 | """放入装机队列功能函数""" 221 | install_id = int(obj_id) 222 | d = install.objects.get(id=install_id) 223 | ipd = d.ipaddr 224 | incd = d.inc 225 | snd = d.sn 226 | channel = d.sotl 227 | dilo_ip = d.ilo_ip 228 | dilo_netmask = d.ilo_netmask 229 | dilo_gw = d.ilo_gw 230 | dksdev = d.ksdev 231 | obj = online(sn=snd,inc=incd,ip=ipd,sotl_total=channel,ilo_ip=dilo_ip,ilo_netmask=dilo_netmask,ilo_gw=dilo_gw,ksdev=dksdev) 232 | obj.save() 233 | d.delete() 234 | disk_sotl.objects.filter(host_id=install_id).update(host_id=obj.id) 235 | 236 | 237 | @login_required(login_url="/") 238 | def online_view(request,obj_id): 239 | """放入装机队列""" 240 | push_install_mq(obj_id) 241 | return HttpResponseRedirect("/find/") 242 | 243 | @login_required(login_url="/") 244 | def piliang(request): 245 | """批量放入装机队列""" 246 | if request.method == "POST": 247 | id_list = request.POST.get("server_list") 248 | id_list = id_list.replace(',',' ').strip().split() 249 | print id_list 250 | for i in id_list: 251 | try: 252 | push_install_mq(i) 253 | except: 254 | return HttpResponse(json.dumps({"code":1})) 255 | return HttpResponse(json.dumps({"code":0})) 256 | 257 | @login_required(login_url="/") 258 | def edit(request,obj_id): 259 | """编辑需要安装的机器""" 260 | if request.method == "GET": 261 | obj = online.objects.get(id=int(obj_id)) 262 | if obj.status: 263 | return HttpResponse("") 264 | f = edit_form(instance=obj) 265 | disk_list = disk_sotl.objects.filter(host_id=obj_id).order_by("sotl") 266 | if not disk_list: 267 | disk_list=None 268 | return render(request,"edit.html",{"forms":f,"disk":disk_list,"id":obj_id}) 269 | elif request.method == "POST": 270 | obj = online.objects.get(id=int(obj_id)) 271 | if obj.status: 272 | return HttpResponse("") 273 | dl = [] 274 | d = request.POST 275 | level = d.get("level") 276 | disk = d.getlist("disk_zh") 277 | ilo_ip = d.get("ilo_ip",None).strip() 278 | ilo_netmask = d.get("ilo_netmask") 279 | ilo_gw = d.get("ilo_gw",None).strip() 280 | eth = d.get('eth') 281 | ks = d.get("kickstart") 282 | tiaodai = d.get("stripe") 283 | sip = d.get("service_ip").strip() 284 | snk = d.get("service_netmask") 285 | sgw = d.get("service_gw").strip() 286 | obj.ilo_netmask = ilo_netmask 287 | obj.eth = eth 288 | obj.level = level 289 | obj.service_netmask = snk 290 | sotl = obj.sotl_total 291 | obj.kickstart = ks 292 | incd = obj.inc 293 | obj.stripe = tiaodai 294 | if len(rc.findall(sip)) == 1: 295 | obj.service_ip = sip 296 | else: 297 | obj.service_ip = "" 298 | if len(rc.findall(sgw)) == 1: 299 | obj.service_gw = sgw 300 | else: 301 | obj.service_gw = "" 302 | if len(rc.findall(ilo_ip)) == 1: 303 | obj.ilo_ip = ilo_ip 304 | else: 305 | obj.ilo_ip = "" 306 | if len(rc.findall(ilo_gw)) == 1: 307 | obj.ilo_gw = ilo_gw 308 | else: 309 | obj.ilo_gw = "" 310 | int_level = int(level) 311 | if int_level == 1: 312 | if len(disk)%2: 313 | obj.raid_zh = "" 314 | obj.save() 315 | return HttpResponseRedirect("/exe/") 316 | elif int_level == 5: 317 | if len(disk) < 3: 318 | obj.raid_zh = "" 319 | obj.save() 320 | return HttpResponseRedirect("/exe/") 321 | elif int_level == 10: 322 | if len(disk)%2: 323 | obj.raid_zh = "" 324 | obj.save() 325 | return HttpResponseRedirect("/exe/") 326 | if "HP" not in incd: 327 | for i in disk: 328 | dl.append(str(sotl)+":"+str(i)) 329 | obj.raid_zh = "[" + ",".join(dl) + "]" 330 | else: 331 | obj.raid_zh = ",".join(disk) 332 | obj.save() 333 | return HttpResponseRedirect("/exe/") 334 | @csrf_exempt 335 | def register_post(request): 336 | """内存OS注册接口""" 337 | if request.method == "POST": 338 | d = request.body 339 | d = json.loads(d) 340 | dmem = d.get('mem').strip() 341 | dcpu = d.get('cpu').strip() 342 | dinc = d.get('inc').strip() 343 | dsn = d.get('sn').strip() 344 | ip = d.get('ip') 345 | dsotl = d.get('sotl') 346 | disk = d.get('disk') 347 | dilo_ip = d.get('ilo_ip',None) 348 | dilo_netmask = d.get('ilo_netmask',None) 349 | dilo_gw = d.get('ilo_gw',None) 350 | dksdev = d.get('ksdev').strip() 351 | obj = install(inc=dinc,ipaddr=ip,cpu=dcpu,mem=dmem,sotl=dsotl,sn=dsn,ilo_ip=dilo_ip,ilo_netmask=dilo_netmask,ilo_gw=dilo_gw,ksdev=dksdev) 352 | obj.save() 353 | install_id = obj.id 354 | for k,v in disk.items(): 355 | dso = disk_sotl(sotl=k,size=v,host_id=install_id) 356 | dso.save() 357 | dso = None 358 | 359 | return HttpResponse(json.dumps({"code":0})) 360 | 361 | @login_required(login_url="/") 362 | def his_page(request): 363 | if request.method == "GET": 364 | f = online.objects.filter(finish_status=True) 365 | his_num = f.count() 366 | total = install.objects.all().count() 367 | on_total = online.objects.filter(finish_status=False).count() 368 | return render(request,"his.html",{'forms':f,'index':'succeed',"total":total, "on_total":on_total,"his_num":his_num}) 369 | 370 | @csrf_exempt 371 | def finish_api(request): 372 | if request.method == "POST": 373 | dsn = request.POST['sn'].strip() 374 | online.objects.filter(sn=dsn).update(finish_status=True) 375 | return HttpResponse(json.dumps({'code':0})) 376 | 377 | @login_required(login_url="/") 378 | def delivery(request,obj_id): 379 | if request.method == "GET": 380 | o = get_object_or_404(online,id=obj_id) 381 | o.delete() 382 | disk_sotl.objects.filter(host_id=int(obj_id)).delete() 383 | cache.delete("%s_ip" % obj_id) 384 | return HttpResponseRedirect('/his/') 385 | @login_required(login_url="/") 386 | def batch_delivery(request): 387 | if request.method == "POST": 388 | id_list = request.POST.get('delivery_list') 389 | id_list = id_list.replace(',',' ').strip().split() 390 | for obj_id in id_list: 391 | try: 392 | o = get_object_or_404(online,id=obj_id) 393 | o.delete() 394 | disk_sotl.objects.filter(host_id=int(obj_id)).delete() 395 | cache.delete("%s_ip" % obj_id) 396 | except: 397 | pass 398 | return HttpResponse(json.dumps({'code':0})) 399 | 400 | @csrf_exempt 401 | def jindu_post(request,get_id): 402 | if request.method == "POST": 403 | jindu = int(request.POST.get('jindu',0)) 404 | cache.set(get_id,jindu,300) 405 | return HttpResponse(json.dumps({'code':0})) 406 | 407 | 408 | @login_required(login_url="/") 409 | def get_jindu_from_cache(request,get_id): 410 | if request.method == "GET": 411 | jindu_val = cache.get(get_id,0) 412 | return HttpResponse(json.dumps({"val":jindu_val})) 413 | 414 | 415 | def get_eth_from_obj(f_id): 416 | o = online.objects.get(id=f_id) 417 | inc = o.inc 418 | ilo_list = ilo_table.objects.values('maunfacturer').iterator() 419 | for i in ilo_list: 420 | print i 421 | if i['maunfacturer'] in inc: 422 | get_pintan = ilo_table.objects.get(maunfacturer=i['maunfacturer']) 423 | kseth = get_pintan.ksdev 424 | break 425 | return kseth 426 | 427 | def kickstart_file_url(request,get_ks_id): 428 | o = online.objects.get(id=int(get_ks_id)) 429 | oid = int(get_ks_id) 430 | return render(request,'ks/%s.cfg' % o.kickstart,{'server':o,'server_ip':server_ip,'content_ip':content_ip,'id':oid}) 431 | 432 | def handle_csv_file(file_name): 433 | f_csv = open(file_name,'wb') 434 | book = csv.writer(f_csv) 435 | object_sn = online.objects.filter(status=False).values_list('sn') 436 | book.writerow(csv_first_line) 437 | for i in object_sn: 438 | book.writerow(['%s' % i[0]]) 439 | 440 | def download_file(request,file_name): 441 | base_dir = os.path.join(os.path.dirname(__file__),'../tools/').replace('\\','/') 442 | print base_dir 443 | if file_name == "autocommit.csv": 444 | handle_csv_file(base_dir+file_name) 445 | f = open(base_dir+file_name,'rb') 446 | else: 447 | f = open(base_dir+file_name,'rb') 448 | file_content = f.read() 449 | f.close() 450 | if file_name == "post.sh" or file_name == "index.py": 451 | file_content = file_content.replace("@@server_ip@@", server_ip) 452 | r = HttpResponse(file_content,content_type='application/octet-stream') 453 | r['Content-Disposition'] = 'attachment; filename=%s' % file_name 454 | return r 455 | 456 | # test SSH server is active [socket] 457 | def ssh_server_is_active(server_id): 458 | cs = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 459 | ipaddress = cache.get("%s_ip" % server_id) 460 | code = cs.connect_ex((ipaddress,22)) 461 | return code 462 | 463 | @login_required(login_url="/") 464 | def ping(request,ping_id): 465 | if request.method == "GET": 466 | r_code = ssh_server_is_active(ping_id) 467 | if not r_code: 468 | o = online.objects.get(id=int(ping_id)) 469 | o.ssh_status = True 470 | o.save() 471 | return HttpResponse(json.dumps({'code':r_code})) 472 | 473 | @login_required(login_url="/") 474 | def export_ip(request): 475 | if request.method == "GET": 476 | f = online.objects.filter(finish_status=True).order_by('service_ip') 477 | return render(request,'export.html',{'forms':f}) 478 | 479 | 480 | def W_or_L(): 481 | """判断平台""" 482 | time_tag = time.strftime("%d",time.localtime(time.time())) 483 | if platform.system() == "Windows": 484 | file_path = "d:/auto_install%s.csv" % time_tag 485 | else: 486 | file_path = "/tmp/auto_install%s.csv" % time_tag 487 | return file_path 488 | 489 | def handle_uploaded_file(f): 490 | """文件处理""" 491 | file_path = W_or_L() 492 | ff = open(file_path,'wb') 493 | for chunk in f.chunks(): 494 | ff.write(chunk) 495 | ff.close() 496 | 497 | @login_required(login_url="/") 498 | def upload_file(request): 499 | """上传文件""" 500 | if request.method == "POST": 501 | try: 502 | s = request.FILES['file'] 503 | if rr.findall(s.name): 504 | pass 505 | else: 506 | return HttpResponse("") 507 | except: 508 | return HttpResponse("") 509 | handle_uploaded_file(s) 510 | return HttpResponse("") 511 | 512 | @login_required(login_url="/") 513 | def auto_commit(request): 514 | """自动提交表单""" 515 | if request.method == "GET": 516 | file_path = W_or_L() 517 | try: 518 | csvbook = csv.reader(open(file_path,'rb'), dialect='excel') 519 | csvbook.next() 520 | except: 521 | return HttpResponse(json.dumps({'code':1})) 522 | for line in csvbook: 523 | try: 524 | sn,level,stripe,disk,ilo_ip,ilo_nk,ilo_gw,s_ip,s_nk,s_gw,system_name,interface = line 525 | o = online.objects.get(sn=sn) 526 | if not o.status: 527 | o.level = level 528 | o.stripe = stripe 529 | o.raid_zh = disk 530 | o.ilo_ip = ilo_ip 531 | o.ilo_netmask = ilo_nk 532 | o.ilo_gw = ilo_gw 533 | o.service_ip = s_ip 534 | o.service_netmask = s_nk 535 | o.service_gw = s_gw 536 | o.kickstart = system_name 537 | o.eth = interface 538 | o.save() 539 | else: 540 | pass 541 | except Exception,e: 542 | print e 543 | pass 544 | return HttpResponse(json.dumps({'code':0})) 545 | -------------------------------------------------------------------------------- /static/boot/css/bootstrap-theme.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | .btn-default, 8 | .btn-primary, 9 | .btn-success, 10 | .btn-info, 11 | .btn-warning, 12 | .btn-danger { 13 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); 14 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 15 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 16 | } 17 | .btn-default:active, 18 | .btn-primary:active, 19 | .btn-success:active, 20 | .btn-info:active, 21 | .btn-warning:active, 22 | .btn-danger:active, 23 | .btn-default.active, 24 | .btn-primary.active, 25 | .btn-success.active, 26 | .btn-info.active, 27 | .btn-warning.active, 28 | .btn-danger.active { 29 | -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 30 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 31 | } 32 | .btn-default .badge, 33 | .btn-primary .badge, 34 | .btn-success .badge, 35 | .btn-info .badge, 36 | .btn-warning .badge, 37 | .btn-danger .badge { 38 | text-shadow: none; 39 | } 40 | .btn:active, 41 | .btn.active { 42 | background-image: none; 43 | } 44 | .btn-default { 45 | text-shadow: 0 1px 0 #fff; 46 | background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); 47 | background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); 48 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); 49 | background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); 50 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); 51 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 52 | background-repeat: repeat-x; 53 | border-color: #dbdbdb; 54 | border-color: #ccc; 55 | } 56 | .btn-default:hover, 57 | .btn-default:focus { 58 | background-color: #e0e0e0; 59 | background-position: 0 -15px; 60 | } 61 | .btn-default:active, 62 | .btn-default.active { 63 | background-color: #e0e0e0; 64 | border-color: #dbdbdb; 65 | } 66 | .btn-default:disabled, 67 | .btn-default[disabled] { 68 | background-color: #e0e0e0; 69 | background-image: none; 70 | } 71 | .btn-primary { 72 | background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); 73 | background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%); 74 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2)); 75 | background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); 76 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); 77 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 78 | background-repeat: repeat-x; 79 | border-color: #2b669a; 80 | } 81 | .btn-primary:hover, 82 | .btn-primary:focus { 83 | background-color: #2d6ca2; 84 | background-position: 0 -15px; 85 | } 86 | .btn-primary:active, 87 | .btn-primary.active { 88 | background-color: #2d6ca2; 89 | border-color: #2b669a; 90 | } 91 | .btn-primary:disabled, 92 | .btn-primary[disabled] { 93 | background-color: #2d6ca2; 94 | background-image: none; 95 | } 96 | .btn-success { 97 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); 98 | background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); 99 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); 100 | background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); 101 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); 102 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 103 | background-repeat: repeat-x; 104 | border-color: #3e8f3e; 105 | } 106 | .btn-success:hover, 107 | .btn-success:focus { 108 | background-color: #419641; 109 | background-position: 0 -15px; 110 | } 111 | .btn-success:active, 112 | .btn-success.active { 113 | background-color: #419641; 114 | border-color: #3e8f3e; 115 | } 116 | .btn-success:disabled, 117 | .btn-success[disabled] { 118 | background-color: #419641; 119 | background-image: none; 120 | } 121 | .btn-info { 122 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 123 | background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 124 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); 125 | background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); 126 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); 127 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 128 | background-repeat: repeat-x; 129 | border-color: #28a4c9; 130 | } 131 | .btn-info:hover, 132 | .btn-info:focus { 133 | background-color: #2aabd2; 134 | background-position: 0 -15px; 135 | } 136 | .btn-info:active, 137 | .btn-info.active { 138 | background-color: #2aabd2; 139 | border-color: #28a4c9; 140 | } 141 | .btn-info:disabled, 142 | .btn-info[disabled] { 143 | background-color: #2aabd2; 144 | background-image: none; 145 | } 146 | .btn-warning { 147 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 148 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 149 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); 150 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); 151 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); 152 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 153 | background-repeat: repeat-x; 154 | border-color: #e38d13; 155 | } 156 | .btn-warning:hover, 157 | .btn-warning:focus { 158 | background-color: #eb9316; 159 | background-position: 0 -15px; 160 | } 161 | .btn-warning:active, 162 | .btn-warning.active { 163 | background-color: #eb9316; 164 | border-color: #e38d13; 165 | } 166 | .btn-warning:disabled, 167 | .btn-warning[disabled] { 168 | background-color: #eb9316; 169 | background-image: none; 170 | } 171 | .btn-danger { 172 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 173 | background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 174 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); 175 | background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); 176 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); 177 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 178 | background-repeat: repeat-x; 179 | border-color: #b92c28; 180 | } 181 | .btn-danger:hover, 182 | .btn-danger:focus { 183 | background-color: #c12e2a; 184 | background-position: 0 -15px; 185 | } 186 | .btn-danger:active, 187 | .btn-danger.active { 188 | background-color: #c12e2a; 189 | border-color: #b92c28; 190 | } 191 | .btn-danger:disabled, 192 | .btn-danger[disabled] { 193 | background-color: #c12e2a; 194 | background-image: none; 195 | } 196 | .thumbnail, 197 | .img-thumbnail { 198 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 199 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 200 | } 201 | .dropdown-menu > li > a:hover, 202 | .dropdown-menu > li > a:focus { 203 | background-color: #e8e8e8; 204 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 205 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 206 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 207 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 208 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 209 | background-repeat: repeat-x; 210 | } 211 | .dropdown-menu > .active > a, 212 | .dropdown-menu > .active > a:hover, 213 | .dropdown-menu > .active > a:focus { 214 | background-color: #357ebd; 215 | background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); 216 | background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); 217 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); 218 | background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); 219 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); 220 | background-repeat: repeat-x; 221 | } 222 | .navbar-default { 223 | background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); 224 | background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); 225 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); 226 | background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); 227 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); 228 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 229 | background-repeat: repeat-x; 230 | border-radius: 4px; 231 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 232 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 233 | } 234 | .navbar-default .navbar-nav > .open > a, 235 | .navbar-default .navbar-nav > .active > a { 236 | background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 237 | background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 238 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); 239 | background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); 240 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); 241 | background-repeat: repeat-x; 242 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 243 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 244 | } 245 | .navbar-brand, 246 | .navbar-nav > li > a { 247 | text-shadow: 0 1px 0 rgba(255, 255, 255, .25); 248 | } 249 | .navbar-inverse { 250 | background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); 251 | background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); 252 | background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); 253 | background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); 254 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); 255 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 256 | background-repeat: repeat-x; 257 | } 258 | .navbar-inverse .navbar-nav > .open > a, 259 | .navbar-inverse .navbar-nav > .active > a { 260 | background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); 261 | background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); 262 | background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); 263 | background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); 264 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); 265 | background-repeat: repeat-x; 266 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 267 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 268 | } 269 | .navbar-inverse .navbar-brand, 270 | .navbar-inverse .navbar-nav > li > a { 271 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); 272 | } 273 | .navbar-static-top, 274 | .navbar-fixed-top, 275 | .navbar-fixed-bottom { 276 | border-radius: 0; 277 | } 278 | .alert { 279 | text-shadow: 0 1px 0 rgba(255, 255, 255, .2); 280 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 281 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 282 | } 283 | .alert-success { 284 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 285 | background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 286 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); 287 | background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); 288 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); 289 | background-repeat: repeat-x; 290 | border-color: #b2dba1; 291 | } 292 | .alert-info { 293 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 294 | background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 295 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); 296 | background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); 297 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); 298 | background-repeat: repeat-x; 299 | border-color: #9acfea; 300 | } 301 | .alert-warning { 302 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 303 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 304 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); 305 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); 306 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); 307 | background-repeat: repeat-x; 308 | border-color: #f5e79e; 309 | } 310 | .alert-danger { 311 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 312 | background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 313 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); 314 | background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); 315 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); 316 | background-repeat: repeat-x; 317 | border-color: #dca7a7; 318 | } 319 | .progress { 320 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 321 | background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 322 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); 323 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); 324 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); 325 | background-repeat: repeat-x; 326 | } 327 | .progress-bar { 328 | background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); 329 | background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%); 330 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9)); 331 | background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); 332 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); 333 | background-repeat: repeat-x; 334 | } 335 | .progress-bar-success { 336 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); 337 | background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); 338 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); 339 | background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); 340 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); 341 | background-repeat: repeat-x; 342 | } 343 | .progress-bar-info { 344 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 345 | background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 346 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); 347 | background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); 348 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); 349 | background-repeat: repeat-x; 350 | } 351 | .progress-bar-warning { 352 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 353 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 354 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); 355 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); 356 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); 357 | background-repeat: repeat-x; 358 | } 359 | .progress-bar-danger { 360 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); 361 | background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); 362 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); 363 | background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); 364 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); 365 | background-repeat: repeat-x; 366 | } 367 | .progress-bar-striped { 368 | background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 369 | background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 370 | background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 371 | } 372 | .list-group { 373 | border-radius: 4px; 374 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 375 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 376 | } 377 | .list-group-item.active, 378 | .list-group-item.active:hover, 379 | .list-group-item.active:focus { 380 | text-shadow: 0 -1px 0 #3071a9; 381 | background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); 382 | background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%); 383 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3)); 384 | background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); 385 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); 386 | background-repeat: repeat-x; 387 | border-color: #3278b3; 388 | } 389 | .list-group-item.active .badge, 390 | .list-group-item.active:hover .badge, 391 | .list-group-item.active:focus .badge { 392 | text-shadow: none; 393 | } 394 | .panel { 395 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 396 | box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 397 | } 398 | .panel-default > .panel-heading { 399 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 400 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 401 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 402 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 403 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 404 | background-repeat: repeat-x; 405 | } 406 | .panel-primary > .panel-heading { 407 | background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); 408 | background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); 409 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); 410 | background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); 411 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); 412 | background-repeat: repeat-x; 413 | } 414 | .panel-success > .panel-heading { 415 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 416 | background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 417 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); 418 | background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); 419 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); 420 | background-repeat: repeat-x; 421 | } 422 | .panel-info > .panel-heading { 423 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 424 | background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 425 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); 426 | background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); 427 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); 428 | background-repeat: repeat-x; 429 | } 430 | .panel-warning > .panel-heading { 431 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 432 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 433 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); 434 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); 435 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); 436 | background-repeat: repeat-x; 437 | } 438 | .panel-danger > .panel-heading { 439 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 440 | background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 441 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); 442 | background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); 443 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); 444 | background-repeat: repeat-x; 445 | } 446 | .well { 447 | background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 448 | background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 449 | background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); 450 | background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); 451 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); 452 | background-repeat: repeat-x; 453 | border-color: #dcdcdc; 454 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 455 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 456 | } 457 | /*# sourceMappingURL=bootstrap-theme.css.map */ 458 | -------------------------------------------------------------------------------- /static/boot/css/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-default .badge,.btn-primary .badge,.btn-success .badge,.btn-info .badge,.btn-warning .badge,.btn-danger .badge{text-shadow:none}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-o-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#2d6ca2));background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary:disabled,.btn-primary[disabled]{background-color:#2d6ca2;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-o-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3071a9));background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-o-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3278b3));background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.list-group-item.active .badge,.list-group-item.active:hover .badge,.list-group-item.active:focus .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} -------------------------------------------------------------------------------- /static/boot/css/jquery.dataTables.min.css: -------------------------------------------------------------------------------- 1 | table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting{cursor:pointer;*cursor:hand}table.dataTable thead .sorting{background:url("../images/sort_both.png") no-repeat center right}table.dataTable thead .sorting_asc{background:url("../images/sort_asc.png") no-repeat center right}table.dataTable thead .sorting_desc{background:url("../images/sort_desc.png") no-repeat center right}table.dataTable thead .sorting_asc_disabled{background:url("../images/sort_asc_disabled.png") no-repeat center right}table.dataTable thead .sorting_desc_disabled{background:url("../images/sort_desc_disabled.png") no-repeat center right}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#abb9d3}table.dataTable.hover tbody tr:hover,table.dataTable.hover tbody tr.odd:hover,table.dataTable.hover tbody tr.even:hover,table.dataTable.display tbody tr:hover,table.dataTable.display tbody tr.odd:hover,table.dataTable.display tbody tr.even:hover{background-color:#f5f5f5}table.dataTable.hover tbody tr:hover.selected,table.dataTable.hover tbody tr.odd:hover.selected,table.dataTable.hover tbody tr.even:hover.selected,table.dataTable.display tbody tr:hover.selected,table.dataTable.display tbody tr.odd:hover.selected,table.dataTable.display tbody tr.even:hover.selected{background-color:#a9b7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#f9f9f9}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad4}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:#f5f5f5}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b3cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a7b5ce}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b6d0}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#f9f9f9}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fbfbfb}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fdfdfd}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad4}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#adbbd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.display tbody tr.odd:hover>.sorting_1,table.dataTable.display tbody tr.even:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.display tbody tr.odd:hover>.sorting_2,table.dataTable.display tbody tr.even:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_2{background-color:#ebebeb}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.display tbody tr.odd:hover>.sorting_3,table.dataTable.display tbody tr.even:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_3{background-color:#eee}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.display tbody tr.odd:hover.selected>.sorting_1,table.dataTable.display tbody tr.even:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_1{background-color:#a1aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.display tbody tr.odd:hover.selected>.sorting_2,table.dataTable.display tbody tr.even:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_2{background-color:#a2afc8}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.display tbody tr.odd:hover.selected>.sorting_3,table.dataTable.display tbody tr.even:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_3{background-color:#a4b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:5px 9px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:5px 9px 3px 9px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px 5px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #cacaca;background-color:#fff;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}} 2 | -------------------------------------------------------------------------------- /static/boot/css/sco.message.css: -------------------------------------------------------------------------------- 1 | #page_message { 2 | display: none; 3 | font-size: 15px; 4 | overflow: visible; 5 | text-align: center; 6 | left: 0; 7 | top: 0; 8 | /* place over all elements, also over modals */ 9 | z-index: 10001; 10 | width: 100%; 11 | border-bottom: 1px solid; 12 | color: white; 13 | padding: 15px; 14 | position: fixed; 15 | } 16 | 17 | .page_mess_error { 18 | background-color: #de4343; 19 | border-color: #ca2424; 20 | } 21 | 22 | .page_mess_ok { 23 | background-color: #48bb5e; 24 | border-color: #38984b; 25 | } 26 | 27 | .page_mess_animate { 28 | background-image: -webkit-linear-gradient(135deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.05) 50%, rgba(255, 255, 255, 0.05) 75%, transparent 75%, transparent); 29 | background-image: -moz-linear-gradient(135deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.05) 50%, rgba(255, 255, 255, 0.05) 75%, transparent 75%, transparent); 30 | background-image: -o-linear-gradient(135deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.05) 50%, rgba(255, 255, 255, 0.05) 75%, transparent 75%, transparent); 31 | background-image: linear-gradient(135deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.05) 50%, rgba(255, 255, 255, 0.05) 75%, transparent 75%, transparent); 32 | -webkit-background-size: 10px 10px; 33 | -moz-background-size: 10px 10px; 34 | -o-background-size: 10px 10px; 35 | background-size: 10px 10px; 36 | -webkit-animation: animate-bg 3s linear infinite; 37 | -moz-animation: animate-bg 3s linear infinite; 38 | -ms-animation: animate-bg 3s linear infinite; 39 | -o-animation: animate-bg 3s linear infinite; 40 | animation: animate-bg 3s linear infinite; 41 | } 42 | 43 | @-moz-keyframes animate-bg { 44 | from { 45 | background-position: 0 0; 46 | } 47 | 48 | to { 49 | background-position: -20px 0; 50 | } 51 | } 52 | 53 | @-webkit-keyframes animate-bg { 54 | from { 55 | background-position: 0 0; 56 | } 57 | 58 | to { 59 | background-position: -20px 0; 60 | } 61 | } 62 | 63 | @-o-keyframes animate-bg { 64 | from { 65 | background-position: 0 0; 66 | } 67 | 68 | to { 69 | background-position: -20px 0; 70 | } 71 | } 72 | 73 | @-ms-keyframes animate-bg { 74 | from { 75 | background-position: 0 0; 76 | } 77 | 78 | to { 79 | background-position: -20px 0; 80 | } 81 | } 82 | 83 | @keyframes animate-bg { 84 | from { 85 | background-position: 0 0; 86 | } 87 | 88 | to { 89 | background-position: -20px 0; 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /static/boot/css/scojs.css: -------------------------------------------------------------------------------- 1 | /* sco.message.js */ 2 | #page_message { 3 | display: none; 4 | font-size: 15px; 5 | overflow: visible; 6 | text-align: center; 7 | left: 0; 8 | top: 0; 9 | /* place over all elements, also over modals */ 10 | z-index: 10001; 11 | width: 100%; 12 | border-bottom: 1px solid; 13 | color: white; 14 | padding: 15px; 15 | position: fixed; 16 | } 17 | 18 | .page_mess_error { 19 | background-color: #de4343; 20 | border-color: #ca2424; 21 | } 22 | 23 | .page_mess_ok { 24 | background-color: #48bb5e; 25 | border-color: #38984b; 26 | } 27 | 28 | .page_mess_animate { 29 | background-image: -webkit-linear-gradient(135deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.05) 50%, rgba(255, 255, 255, 0.05) 75%, transparent 75%, transparent); 30 | background-image: -moz-linear-gradient(135deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.05) 50%, rgba(255, 255, 255, 0.05) 75%, transparent 75%, transparent); 31 | background-image: -o-linear-gradient(135deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.05) 50%, rgba(255, 255, 255, 0.05) 75%, transparent 75%, transparent); 32 | background-image: linear-gradient(135deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.05) 50%, rgba(255, 255, 255, 0.05) 75%, transparent 75%, transparent); 33 | -webkit-background-size: 10px 10px; 34 | -moz-background-size: 10px 10px; 35 | -o-background-size: 10px 10px; 36 | background-size: 10px 10px; 37 | -webkit-animation: animate-bg 3s linear infinite; 38 | -moz-animation: animate-bg 3s linear infinite; 39 | -ms-animation: animate-bg 3s linear infinite; 40 | -o-animation: animate-bg 3s linear infinite; 41 | animation: animate-bg 3s linear infinite; 42 | } 43 | 44 | @-moz-keyframes animate-bg { 45 | from { 46 | background-position: 0 0; 47 | } 48 | 49 | to { 50 | background-position: -20px 0; 51 | } 52 | } 53 | 54 | @-webkit-keyframes animate-bg { 55 | from { 56 | background-position: 0 0; 57 | } 58 | 59 | to { 60 | background-position: -20px 0; 61 | } 62 | } 63 | 64 | @-o-keyframes animate-bg { 65 | from { 66 | background-position: 0 0; 67 | } 68 | 69 | to { 70 | background-position: -20px 0; 71 | } 72 | } 73 | 74 | @-ms-keyframes animate-bg { 75 | from { 76 | background-position: 0 0; 77 | } 78 | 79 | to { 80 | background-position: -20px 0; 81 | } 82 | } 83 | 84 | @keyframes animate-bg { 85 | from { 86 | background-position: 0 0; 87 | } 88 | 89 | to { 90 | background-position: -20px 0; 91 | } 92 | } 93 | 94 | 95 | /* sco.tooltip.js */ 96 | .tooltip { 97 | padding: .6em; 98 | width: 12em; 99 | z-index: 10001; 100 | position: absolute; 101 | background: #444; 102 | color: #f9f9f9; 103 | font-size: 90%; 104 | display: none; 105 | -webkit-border-radius: 3px; 106 | -moz-border-radius: 3px; 107 | border-radius: 3px; 108 | opacity: 1; 109 | filter: alpha(opacity=100); 110 | } 111 | 112 | .tooltip .pointer { 113 | position: absolute; 114 | width: 0; 115 | height: 0; 116 | margin: 0; 117 | } 118 | 119 | .tooltip.pos_e .pointer { 120 | border-right: 8px solid #444; 121 | border-top: 8px dashed transparent; 122 | border-bottom: 8px dashed transparent; 123 | left: -8px; 124 | top: 50%; 125 | margin-top: -8px; 126 | } 127 | 128 | .tooltip.pos_w .pointer { 129 | border-left: 8px solid #444; 130 | border-top: 8px dashed transparent; 131 | border-bottom: 8px dashed transparent; 132 | right: -8px; 133 | top: 50%; 134 | margin-top: -8px; 135 | } 136 | 137 | .tooltip.pos_n .pointer { 138 | border-top: 8px solid #444; 139 | border-left: 8px dashed transparent; 140 | border-right: 8px dashed transparent; 141 | left: 50%; 142 | margin-left: -8px; 143 | bottom: -8px; 144 | } 145 | 146 | .tooltip.pos_s .pointer { 147 | border-bottom: 8px solid #444; 148 | border-left: 8px dashed transparent; 149 | border-right: 8px dashed transparent; 150 | left: 50%; 151 | margin-left: -8px; 152 | top: -8px; 153 | } 154 | 155 | .tooltip.pos_nw .pointer { 156 | border-top: 14px solid #444; 157 | border-left: 14px dashed transparent; 158 | border-right: 0px dashed transparent; 159 | left: 100%; 160 | margin-left: -20px; 161 | bottom: -13px; 162 | } 163 | 164 | .tooltip.pos_sw .pointer { 165 | border-bottom: 14px solid #444; 166 | border-left: 14px dashed transparent; 167 | border-right: 0px dashed transparent; 168 | left: 100%; 169 | margin-left: -20px; 170 | top: -13px; 171 | } 172 | 173 | .tooltip.pos_se .pointer { 174 | border-bottom: 14px solid #444; 175 | border-right: 14px dashed transparent; 176 | border-left: 0px dashed transparent; 177 | left: 8px; 178 | top: -13px; 179 | } 180 | 181 | .tooltip.pos_ne .pointer { 182 | border-top: 14px solid #444; 183 | border-right: 14px dashed transparent; 184 | border-left: 0px dashed transparent; 185 | left: 8px; 186 | bottom: -13px; 187 | } 188 | 189 | 190 | /* sco.panes.js */ 191 | .pane-wrapper { 192 | position: relative; 193 | overflow: hidden; 194 | } 195 | 196 | .pane-wrapper > div { 197 | width: 100%; 198 | display: none; 199 | top: 0; 200 | left: 0; 201 | position: relative; 202 | transition: .6s ease-in-out all; 203 | -webkit-transition: .6s ease-in-out all; 204 | -o-transition: all .6s ease-in-out; 205 | -moz-transition: all .6s ease-in-out; 206 | -ms-transition: all .6s ease-in-out; 207 | } 208 | 209 | .pane-wrapper > .active, 210 | .pane-wrapper > .prev, 211 | .pane-wrapper > .next { 212 | display: block; 213 | } 214 | 215 | .pane-wrapper.xfade > div, 216 | .pane-wrapper.xfade > .active.right, 217 | .pane-wrapper.xfade > .active.left { 218 | opacity: 0; 219 | } 220 | .pane-wrapper.xfade > .next.left, 221 | .pane-wrapper.xfade > .prev.right, 222 | .pane-wrapper.xfade > .active { 223 | opacity: 1; 224 | } 225 | .pane-wrapper.xfade > .next, 226 | .pane-wrapper.xfade > .prev { 227 | position: absolute; 228 | } 229 | 230 | .pane-wrapper.slide > .active { 231 | left: 0; 232 | } 233 | .pane-wrapper.slide > .next, 234 | .pane-wrapper.slide > .prev { 235 | position: absolute; 236 | width: 100%; 237 | } 238 | .pane-wrapper.slide > .next { 239 | left: 100%; 240 | } 241 | .pane-wrapper.slide > .prev { 242 | left: -100%; 243 | } 244 | .pane-wrapper.slide > .next.left, 245 | .pane-wrapper.slide > .prev.right { 246 | left: 0; 247 | } 248 | .pane-wrapper.slide > .active.left { 249 | left: -100%; 250 | } 251 | .pane-wrapper.slide > .active.right { 252 | left: 100%; 253 | } 254 | 255 | .pane-wrapper.flip > div { 256 | position: relative; 257 | width: 100%; 258 | top: 0; 259 | left: 0; 260 | -webkit-transform: rotateY(-180deg); 261 | -moz-transform: rotateY(-180deg); 262 | -webkit-transform-style: preserve-3d; 263 | -moz-transform-style: preserve-3d; 264 | -webkit-backface-visibility: hidden; 265 | -moz-backface-visibility: hidden; 266 | } 267 | 268 | .pane-wrapper.flip > .active { 269 | -webkit-transform: rotateY(0deg); 270 | -moz-transform: rotateY(0deg); 271 | } 272 | 273 | .pane-wrapper.flip > .next, 274 | .pane-wrapper.flip > .prev { 275 | position: absolute; 276 | display: block; 277 | } 278 | 279 | .pane-wrapper.flip > .active.left { 280 | -webkit-transform: rotateY(-180deg); 281 | -moz-transform: rotateY(-180deg); 282 | } 283 | 284 | .pane-wrapper.flip > .active.right { 285 | -webkit-transform: rotateY(180deg); 286 | -moz-transform: rotateY(180deg); 287 | } 288 | .pane-wrapper.flip > .next.left, 289 | .pane-wrapper.flip > .prev.right { 290 | -webkit-transform: rotateY(0deg); 291 | -moz-transform: rotateY(0deg); 292 | } 293 | -------------------------------------------------------------------------------- /static/boot/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /static/boot/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /static/boot/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /static/boot/images/Sorting icons.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/Sorting icons.psd -------------------------------------------------------------------------------- /static/boot/images/back_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/back_disabled.png -------------------------------------------------------------------------------- /static/boot/images/back_enabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/back_enabled.png -------------------------------------------------------------------------------- /static/boot/images/back_enabled_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/back_enabled_hover.png -------------------------------------------------------------------------------- /static/boot/images/edit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/edit.jpg -------------------------------------------------------------------------------- /static/boot/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/favicon.ico -------------------------------------------------------------------------------- /static/boot/images/forward_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/forward_disabled.png -------------------------------------------------------------------------------- /static/boot/images/forward_enabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/forward_enabled.png -------------------------------------------------------------------------------- /static/boot/images/forward_enabled_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/forward_enabled_hover.png -------------------------------------------------------------------------------- /static/boot/images/info.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/info.jpg -------------------------------------------------------------------------------- /static/boot/images/jd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/jd.jpg -------------------------------------------------------------------------------- /static/boot/images/jt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/jt.jpg -------------------------------------------------------------------------------- /static/boot/images/jt_login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/jt_login.jpg -------------------------------------------------------------------------------- /static/boot/images/login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/login.jpg -------------------------------------------------------------------------------- /static/boot/images/sort_asc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/sort_asc.png -------------------------------------------------------------------------------- /static/boot/images/sort_asc_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/sort_asc_disabled.png -------------------------------------------------------------------------------- /static/boot/images/sort_both.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/sort_both.png -------------------------------------------------------------------------------- /static/boot/images/sort_desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/sort_desc.png -------------------------------------------------------------------------------- /static/boot/images/sort_desc_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/sort_desc_disabled.png -------------------------------------------------------------------------------- /static/boot/images/wancheng.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaoming655/auto_install/e8a6a864ca7c9b0a68bd11512240f7e3a7d26eec/static/boot/images/wancheng.jpg -------------------------------------------------------------------------------- /static/boot/js/ajax.js: -------------------------------------------------------------------------------- 1 | $(document).ajaxSend(function(event, xhr, settings) { 2 | function getCookie(name) { 3 | var cookieValue = null; 4 | if (document.cookie && document.cookie != '') { 5 | var cookies = document.cookie.split(';'); 6 | for (var i = 0; i < cookies.length; i++) { 7 | var cookie = jQuery.trim(cookies[i]); 8 | // Does this cookie string begin with the name we want? 9 | if (cookie.substring(0, name.length + 1) == (name + '=')) { 10 | cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 11 | break; 12 | } 13 | } 14 | } 15 | return cookieValue; 16 | } 17 | function sameOrigin(url) { 18 | // url could be relative or scheme relative or absolute 19 | var host = document.location.host; // host + port 20 | var protocol = document.location.protocol; 21 | var sr_origin = '//' + host; 22 | var origin = protocol + sr_origin; 23 | // Allow absolute or scheme relative URLs to same origin 24 | return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || 25 | (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') || 26 | // or any other URL that isn't scheme relative or absolute i.e relative. 27 | !(/^(\/\/|http:|https:).*/.test(url)); 28 | } 29 | function safeMethod(method) { 30 | return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 31 | } 32 | 33 | if (!safeMethod(settings.type) && sameOrigin(settings.url)) { 34 | xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 35 | } 36 | }); -------------------------------------------------------------------------------- /static/boot/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.0",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus","focus"==b.type)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.0",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c="prev"==a?-1:1,d=this.getItemIndex(b),e=(d+c)%this.$items.length;return this.$items.eq(e)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i="next"==b?"first":"last",j=this;if(!f.length){if(!this.options.wrap)return;f=this.$element.find(".item")[i]()}if(f.hasClass("active"))return this.sliding=!1;var k=f[0],l=a.Event("slide.bs.carousel",{relatedTarget:k,direction:h});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var m=a(this.$indicators.children()[this.getItemIndex(f)]);m&&m.addClass("active")}var n=a.Event("slid.bs.carousel",{relatedTarget:k,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),j.sliding=!1,setTimeout(function(){j.$element.trigger(n)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(n)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.0",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.find("> .panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('