├── LICENSE ├── README.md ├── README.md~ ├── ajax.html ├── base_config.html ├── cgi-bin ├── base_config.c ├── base_config.cgi ├── cgic.c ├── cgic.h ├── config_info.c ├── config_sql.c ├── config编译说明.txt ├── get.c ├── get.cgi ├── getdata.c ├── ifconfig.c ├── login.c ├── login.cgi ├── person.db ├── register.c ├── register.cgi ├── sql.c ├── sql.h ├── sqlite3.c ├── sqlite3.h ├── upload.c ├── upload.cgi └── upload2.c ├── css ├── bootstrap-grid.css ├── bootstrap-grid.css.map ├── bootstrap-grid.min.css ├── bootstrap-grid.min.css.map ├── bootstrap-reboot.css ├── bootstrap-reboot.css.map ├── bootstrap-reboot.min.css ├── bootstrap-reboot.min.css.map ├── bootstrap.css ├── bootstrap.css.map ├── bootstrap.min.css ├── bootstrap.min.css.map ├── config.css ├── jquery-ui.min.css ├── login.css └── register.css ├── img ├── config_bg.jpg ├── login_bg.jpg ├── login_head.jpg ├── login_head.png └── register_head.png ├── js ├── bootstrap.bundle.js ├── bootstrap.bundle.js.map ├── bootstrap.bundle.min.js ├── bootstrap.bundle.min.js.map ├── bootstrap.js ├── bootstrap.js.map ├── bootstrap.min.js ├── bootstrap.min.js.map ├── jquery-2.2.3.min.js ├── jquery-ui.min.js └── my.js ├── login.html ├── register.html ├── upload.html └── 环境搭建参考 ├── apache.txt ├── boa-0.94.13.tar.gz ├── boa-0.94.13.zip ├── boa.conf ├── ccgi.txt ├── cgic207.tar.gz ├── mime.types └── 相关链接.txt /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 前言 2 | 3 | 效果参考: 4 | 5 | https://ikaros-521.gitee.io/boa_cgi_html_mysql/login.html 6 | 7 | 使用到的软件和技术 8 | 9 | BOA服务器,CGI,CCGI,MySQL,SQLite。C,HTML,CSS,JS,SQL 10 | 11 | 具体功能讲解 12 | 13 | 1、运行BOA服务器 (来到BOA目录下的src,终端输入 sudo ./boa 启动服务) 14 | 15 | 2、打开浏览器,输入localhost:端口号/login.html (文件都要放在 /var/www 目录下) 16 | 17 | 3、登录页面,注册页面。(登录注册将表单发送给对应CGI文件,CGI文件和MySQL数据库交互(运行MySQL,建好数据库和表),将结果输出) 18 | 19 | 4、登录成功后会来到 配置页面。(对相应参数进行配置,可自由发挥,同样HTML的表单发送给CGI程序,打开系统文件,写入相应参数,重启服务) 20 | 21 | 环境搭建和配置等其他问题可以参考大佬的博客讲解 [https://blog.csdn.net/A642960662/article/details/66473793](https://blog.csdn.net/A642960662/article/details/66473793) 22 | 23 | ajax局部刷新,这个demo链接在这 [https://gitee.com/ikaros-521/ajax_cgi/tree/master](https://gitee.com/ikaros-521/ajax_cgi/tree/master) 24 | 25 | 由于本工程当时是在刚接触Boa不久就编写的,所以比较混乱,如果希望有个清晰点的demo工程进行参考,可以参考我的新文章:[Linux下 基于Boa的应用资源管理系统 SMS](https://ikaros.blog.csdn.net/article/details/121848899),新工程的地址 [https://github.com/Ikaros-521/boa_cgi_SMS](https://github.com/Ikaros-521/boa_cgi_SMS) 26 | 27 | ## 准备环境 28 | 29 | 操作系统: Ubuntu12.04 LTS 30 | 31 | 环境搭建: 需要 [BOA](http://www.boa.org/),CCGI,MySQL,GCC 32 | 33 | [Linux下嵌入式Web服务器BOA和CGI编程开发](https://blog.csdn.net/Ikaros_521/article/details/102610768) 34 | 35 | [数据库的相关知识——学习笔记](https://blog.csdn.net/Ikaros_521/article/details/102610768) 的三 36 | 37 | [mysql中文乱码问题解决 / C程序插入仍是乱码解决 / 卸载重装教学](https://blog.csdn.net/Ikaros_521/article/details/102664117) 38 | 39 | 扩展: 我还用了[bootstrap](https://www.runoob.com/bootstrap/bootstrap-tutorial.html)框架,CSS/JS 40 | 41 | 源码链接:GitHub:[传送门](https://github.com/Ikaros-521/boa_cgi_html_mysql) , 码云:[传送门](https://gitee.com/ikaros-521/boa_cgi_html_mysql) 42 | 43 | ## 使用方法 44 | 45 | 环境准备好后,我们在 /var/www 下写HTML文件 46 | 47 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132133_b3009318_5140590.png) 48 | 49 | 在 /var/www/cgi-bin 下写c文件,编译后命名为.cgi。 50 | 51 | 编译命令仅供参考 52 | 53 | `gcc -o login.cgi login.c cgic.c -lpthread -ldl -lmysqlclient` 54 | 55 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132132_1fb658de_5140590.png) 56 | 57 | 程序都写好后,我们开始测试。 58 | 59 | 60 | **1、开启MySQL服务 默认开启** 61 | 62 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132133_1a9afdc8_5140590.png) 63 | 64 | 我的程序需要事先 新建用户test,数据库register,表user 65 | 66 | ```bash 67 | mysql -utest -ptest 68 | ``` 69 | 70 | ```sql 71 | // 创建新用户test 72 | mysql> create user 'test'@'localhost' identified by 'test'; 73 | // 给test用户所有权限 74 | mysql> grant all privileges on *.* to test@localhost identified by 'test'; 75 | // 刷新权限 76 | mysql> flush privileges; 77 | ``` 78 | 79 | ```sql 80 | mysql> create database register; 81 | ``` 82 | 83 | ```sql 84 | mysql> use register; 85 | mysql> CREATE TABLE user(username varchar(20) PRIMARY KEY,password varchar(20)); 86 | ``` 87 | 88 | **2、开启BOA服务器,在/boa/src目录下** `sudo ./boa` 89 | 90 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132133_f700e66f_5140590.png) 91 | 92 | **3、打开浏览器,访问localhost:端口号 访问的即 /var/www 目录** 93 | 94 | **我直接访问 http://localhost:886/login.html 我的登录页面** 95 | 96 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132133_e7bdc3ce_5140590.png) 97 | 98 | 其他页面都是同理。 99 | 100 | ## 思路讲解 101 | 102 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132132_571039c1_5140590.png) 103 | 104 | **开启boa服务器后,我们访问到我们在 /var/www 下编写的HTML文件,显示我们的登录页面。 105 | 我们点击“注册”按钮,跳转到 register.html** 106 | 107 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132133_86b0bd91_5140590.png) 108 | 109 | **点击“注册”按钮,提交form表单信息给cgi-bin/register.cgi** 110 | 111 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132132_d547f5dc_5140590.png) 112 | 113 | **cgi程序通过 cgiFormString函数试图检索发送给指定字段的字符串。存入变量中。我们连接MySQL数据库** 114 | 115 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132133_cacd702b_5140590.png) 116 | 117 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132133_6fed70a0_5140590.png) 118 | 119 | **将数据写入register数据库中的user表中(此数据库和表需要先建好)** 120 | 121 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132132_c2ec4688_5140590.png) 122 | 123 | **处理完毕后,跳回 login.html 登录页面** 124 | 125 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132133_f52eddcc_5140590.png) 126 | 127 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132133_8c29a6c5_5140590.png) 128 | 129 | **现在我们输入数据,点击“登录”,同理将表单发给 login.cgi ,对数据在MySQL数据库中查询后,成功就来到base_config.html 配置页面。** 130 | 131 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132132_2d22eb4b_5140590.png) 132 | 133 | **然后我们输入相应数据,点击“提交”,交给base_config.cgi处理,之后任意发挥就好了。** 134 | 135 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132132_85401fe3_5140590.png) 136 | 137 | **我是打印出来,写入系统文件的代码暂时注释了,慎用** 138 | 139 | ![在这里插入图片描述](https://images.gitee.com/uploads/images/2019/1204/132133_6d4c6fd5_5140590.png) 140 | 141 | *遇到问题可以参考页首的链接* 142 | 143 | --- 144 | 145 | 146 | **其余参考[GitHub](https://github.com/Ikaros-521/boa_cgi_html_mysql)或[码云](https://gitee.com/ikaros-521/boa_cgi_html_mysql)** 147 | 148 | ## 补充 149 | ### 文件上传 150 | 前端post方式上传文件到后端 /var/www/cgi-bin 目录下 151 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210114163024637.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0lrYXJvc181MjE=,size_16,color_FFFFFF,t_70) 152 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210114163624243.png) 153 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210114163640400.png) 154 | -------------------------------------------------------------------------------- /README.md~: -------------------------------------------------------------------------------- 1 | 使用到的软件和技术 2 | BOA服务器,Apache,CGI,CCGI,MySQL,SQLite。C,HTML,CSS,JS,SQL 3 | 具体功能讲解 4 | 1、运行BOA服务器 (来到BOA目录下的src,终端输入 sudo ./boa 启动服务) 5 | 2、打开浏览器,输入localhost:端口号/login.html (文件都要放在 /var/www 目录下) 6 | 3、登录页面,注册页面。(登录注册将表单发送给对应CGI文件,CGI文件和MySQL数据库交互(运行MySQL,建好数据库和表),将结果输出) 7 | 4、登录成功后会来到 配置页面。(对相应参数进行配置,可自由发挥,同样HTML的表单发送给CGI程序,打开系统文件,写入相应参数,重启服务) 8 | 环境搭建和配置等其他问题可以参考大佬的博客讲解 9 | https://blog.csdn.net/A642960662/article/details/66473793 10 | -------------------------------------------------------------------------------- /ajax.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | config 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 30 |
31 |
32 |
ajax获取后端返回数据:
33 | 34 | 35 |
36 |
37 | 40 |
41 | 42 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /base_config.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | config 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 30 |
31 |
32 |
33 |

常规设置

34 |
35 | 36 | 37 | 43 | 49 | 50 | 51 | 57 | 63 | 64 | 65 | 72 | 79 | 80 |
38 |
39 | 40 | 41 |
42 |
44 |
45 | 46 | 47 |
48 |
52 |
53 | 54 | 55 |
56 |
58 |
59 | 60 | 61 |
62 |
66 |
67 | 68 | 69 | 70 |
71 |
73 |
74 | 75 | 76 | 77 |
78 |
81 |
82 | 83 |
84 |
85 |
86 |
87 |
88 | 89 | 93 | 94 |
95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /cgi-bin/base_config.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "cgic.h" 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | int cgiMain(void) 11 | { 12 | char device_name[64]; 13 | char LaL[64]; 14 | char lamp_id[10]; 15 | char maintainer_info[64]; 16 | char device_ip[20]; 17 | char phone[20]; 18 | char username[20]; 19 | char password[20]; 20 | char gateway[20]; 21 | char server_ip[20]; 22 | char dns[20]; 23 | char subnet_mask[20]; 24 | char dhcp[20]; 25 | char error[20]; 26 | //回显信息到HTML网页cgiHeaderContentType("text/html"); 27 | printf("\n\n"); 28 | printf("\n\n"); 29 | printf("

\n\n"); 30 | // 获取表单中的name的值,存入name缓冲区 31 | // cgiFormString试图检索发送给指定字段的字符串。文本会被拷贝到指定的result buffer中,最多但不超过max-1个字节。null字符标记字符串的结束。 32 | if(cgiFormString("gateway", gateway, sizeof(gateway)) != cgiFormSuccess) 33 | { 34 | fprintf(stderr, "cgiFormString function gateway failed"); 35 | //exit(-1); 36 | } 37 | printf("网关:%s\n\n",gateway); 38 | printf("
\n\n"); 39 | if(cgiFormString("server_ip", server_ip, sizeof(server_ip)) != cgiFormSuccess) 40 | { 41 | fprintf(stderr, "cgiFormString function server_ip failed"); 42 | exit(-1); 43 | } 44 | printf("服务器IP:%s\n\n",server_ip); 45 | printf("
\n\n"); 46 | if(cgiFormString("dns", dns, sizeof(dns)) != cgiFormSuccess) 47 | { 48 | fprintf(stderr, "cgiFormString function dns failed"); 49 | //exit(-1); 50 | } 51 | printf("DNS:%s\n\n",dns); 52 | printf("
\n\n"); 53 | if(cgiFormString("subnet_mask", subnet_mask, sizeof(subnet_mask)) != cgiFormSuccess) 54 | { 55 | fprintf(stderr, "cgiFormString function subnet_mask failed"); 56 | exit(-1); 57 | } 58 | printf("子网掩码:%s\n\n",subnet_mask); 59 | printf("
\n\n"); 60 | if(cgiFormString("dhcp", dhcp, sizeof(dhcp)) != cgiFormSuccess) 61 | { 62 | fprintf(stderr, "cgiFormString function dhcp failed"); 63 | exit(-1); 64 | } 65 | printf("是否开启DHCP:%s\n\n",dhcp); 66 | printf("
\n\n"); 67 | if(cgiFormString("error", error, sizeof(error)) != cgiFormSuccess) 68 | { 69 | fprintf(stderr, "cgiFormString function error failed"); 70 | //exit(-1); 71 | } 72 | printf("是否自动上报异常:%s\n\n",error); 73 | printf("
\n\n"); 74 | 75 | // 写入base_info.json文件中 76 | //将umask值设置为0000,实际创建的文件权限即为下面的mode值 77 | 78 | /* 79 | umask(0000); 80 | int fd = open("base_info.json",O_CREAT|O_TRUNC|O_RDWR,0777); 81 | 82 | char buf[4096] = {}; 83 | sprintf(buf,"{\"info\":[{\"device_name\":\"%s\",\"LaL\":\"%s\",\"lamp_id\":\"%s\",\"maintainer_info\":\"%s\",\"device_ip\":\"%s\", \"phone\":\"%s\",\"username\":\"%s\",\"password\":\"%s\",\"gateway\":\"%s\",\"server_ip\":\"%s\",\"dns\":\"%s\",\"subnet_mask\":\"%s\", \"dhcp\":\"%s\",\"error\":\"%s\"}]}",device_name,LaL,lamp_id,maintainer_info,device_ip,phone,username,password,gateway,server_ip,dns,subnet_mask,dhcp,error); 84 | 85 | write(fd,buf,strlen(buf)); 86 | 87 | close(fd); 88 | */ 89 | 90 | /*************************** 91 | 92 | char buf[1024] = {}; // 将配置信息写入字符串,再写入文件 93 | // 修改IP地址(eth0为网卡名称) 94 | sprintf(buf,"sudo ifconfig eth0 %s netmask %s",device_ip,subnet_mask); 95 | system(buf); 96 | // 修改默认网关(eth0为网卡名称) 97 | sprintf(buf,"route add default gw %s dev eth0",gateway); 98 | system(buf); 99 | 100 | // 对系统文件进行操作 101 | system("sudo chmod 777 /etc/network/interfaces"); // 修改文件权限 102 | system("sudo chmod 777 /etc/resolvconf/resolv.conf.d/base"); 103 | int fd_interfaces = open("/etc/network/interfaces",O_RDWR|O_TRUNC); // 打开文件 104 | if(-1 == fd_interfaces) 105 | { 106 | printf("/etc/network/interfaces open failed\n"); 107 | } 108 | 109 | int size = 0; 110 | int fd_base = open("/etc/resolvconf/resolv.conf.d/base",O_RDWR|O_TRUNC); 111 | sprintf(buf,"search localdomain\nnameserver %s\nnameserver %s",dns,dns); 112 | size = write(fd_base,buf, strlen(buf)); 113 | close(fd_base); 114 | 115 | sprintf(buf,"auto lo\niface lo inet loopback\nauto eth0\niface eth0 inet static\naddress%s\nnetmask%s\ngateway%s\n",device_ip,subnet_mask,gateway); 116 | size = write(fd_interfaces,buf, strlen(buf)); 117 | close(fd_interfaces); 118 | 119 | ******************************/ 120 | 121 | printf("

相应参数配置完成

\n\n"); 122 | 123 | //printf("\n"); 124 | 125 | return 0; 126 | } 127 | -------------------------------------------------------------------------------- /cgi-bin/base_config.cgi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ikaros-521/boa_cgi_html_mysql/9b6a309ceca109ce802041f45e6f25aa1075d211/cgi-bin/base_config.cgi -------------------------------------------------------------------------------- /cgi-bin/cgic.h: -------------------------------------------------------------------------------- 1 | /* The CGI_C library, by Thomas Boutell, version 2.01. CGI_C is intended 2 | to be a high-quality API to simplify CGI programming tasks. */ 3 | 4 | /* Make sure this is only included once. */ 5 | 6 | #ifndef CGI_C 7 | #define CGI_C 1 8 | 9 | /* Bring in standard I/O since some of the functions refer to 10 | types defined by it, such as FILE *. */ 11 | 12 | #include 13 | 14 | /* The various CGI environment variables. Instead of using getenv(), 15 | the programmer should refer to these, which are always 16 | valid null-terminated strings (they may be empty, but they 17 | will never be null). If these variables are used instead 18 | of calling getenv(), then it will be possible to save 19 | and restore CGI environments, which is highly convenient 20 | for debugging. */ 21 | 22 | extern char *cgiServerSoftware; 23 | extern char *cgiServerName; 24 | extern char *cgiGatewayInterface; 25 | extern char *cgiServerProtocol; 26 | extern char *cgiServerPort; 27 | extern char *cgiRequestMethod; 28 | extern char *cgiPathInfo; 29 | extern char *cgiPathTranslated; 30 | extern char *cgiScriptName; 31 | extern char *cgiQueryString; 32 | extern char *cgiRemoteHost; 33 | extern char *cgiRemoteAddr; 34 | extern char *cgiAuthType; 35 | extern char *cgiRemoteUser; 36 | extern char *cgiRemoteIdent; 37 | extern char *cgiContentType; 38 | extern char *cgiAccept; 39 | extern char *cgiUserAgent; 40 | extern char *cgiReferrer; 41 | 42 | /* Cookies as sent to the server. You can also get them 43 | individually, or as a string array; see the documentation. */ 44 | extern char *cgiCookie; 45 | 46 | /* A macro providing the same incorrect spelling that is 47 | found in the HTTP/CGI specifications */ 48 | #define cgiReferer cgiReferrer 49 | 50 | /* The number of bytes of data received. 51 | Note that if the submission is a form submission 52 | the library will read and parse all the information 53 | directly from cgiIn; the programmer need not do so. */ 54 | 55 | extern int cgiContentLength; 56 | 57 | /* Pointer to CGI output. The cgiHeader functions should be used 58 | first to output the mime headers; the output HTML 59 | page, GIF image or other web document should then be written 60 | to cgiOut by the programmer. In the standard CGIC library, 61 | cgiOut is always equivalent to stdout. */ 62 | 63 | extern FILE *cgiOut; 64 | 65 | /* Pointer to CGI input. The programmer does not read from this. 66 | We have continued to export it for backwards compatibility 67 | so that cgic 1.x applications link properly. */ 68 | 69 | extern FILE *cgiIn; 70 | 71 | /* Possible return codes from the cgiForm family of functions (see below). */ 72 | 73 | typedef enum { 74 | cgiFormSuccess, 75 | cgiFormTruncated, 76 | cgiFormBadType, 77 | cgiFormEmpty, 78 | cgiFormNotFound, 79 | cgiFormConstrained, 80 | cgiFormNoSuchChoice, 81 | cgiFormMemory, 82 | cgiFormNoFileName, 83 | cgiFormNoContentType, 84 | cgiFormNotAFile, 85 | cgiFormOpenFailed, 86 | cgiFormIO, 87 | cgiFormEOF 88 | } cgiFormResultType; 89 | 90 | /* These functions are used to retrieve form data. See 91 | cgic.html for documentation. */ 92 | 93 | extern cgiFormResultType cgiFormString( 94 | char *name, char *result, int max); 95 | 96 | extern cgiFormResultType cgiFormStringNoNewlines( 97 | char *name, char *result, int max); 98 | 99 | 100 | extern cgiFormResultType cgiFormStringSpaceNeeded( 101 | char *name, int *length); 102 | 103 | 104 | extern cgiFormResultType cgiFormStringMultiple( 105 | char *name, char ***ptrToStringArray); 106 | 107 | extern void cgiStringArrayFree(char **stringArray); 108 | 109 | extern cgiFormResultType cgiFormInteger( 110 | char *name, int *result, int defaultV); 111 | 112 | extern cgiFormResultType cgiFormIntegerBounded( 113 | char *name, int *result, int min, int max, int defaultV); 114 | 115 | extern cgiFormResultType cgiFormDouble( 116 | char *name, double *result, double defaultV); 117 | 118 | extern cgiFormResultType cgiFormDoubleBounded( 119 | char *name, double *result, double min, double max, double defaultV); 120 | 121 | extern cgiFormResultType cgiFormSelectSingle( 122 | char *name, char **choicesText, int choicesTotal, 123 | int *result, int defaultV); 124 | 125 | 126 | extern cgiFormResultType cgiFormSelectMultiple( 127 | char *name, char **choicesText, int choicesTotal, 128 | int *result, int *invalid); 129 | 130 | /* Just an alias; users have asked for this */ 131 | #define cgiFormSubmitClicked cgiFormCheckboxSingle 132 | 133 | extern cgiFormResultType cgiFormCheckboxSingle( 134 | char *name); 135 | 136 | extern cgiFormResultType cgiFormCheckboxMultiple( 137 | char *name, char **valuesText, int valuesTotal, 138 | int *result, int *invalid); 139 | 140 | extern cgiFormResultType cgiFormRadio( 141 | char *name, char **valuesText, int valuesTotal, 142 | int *result, int defaultV); 143 | 144 | /* The paths returned by this function are the original names of files 145 | as reported by the uploading web browser and shoult NOT be 146 | blindly assumed to be "safe" names for server-side use! */ 147 | extern cgiFormResultType cgiFormFileName( 148 | char *name, char *result, int max); 149 | 150 | /* The content type of the uploaded file, as reported by the browser. 151 | It should NOT be assumed that browsers will never falsify 152 | such information. */ 153 | extern cgiFormResultType cgiFormFileContentType( 154 | char *name, char *result, int max); 155 | 156 | extern cgiFormResultType cgiFormFileSize( 157 | char *name, int *sizeP); 158 | 159 | typedef struct cgiFileStruct *cgiFilePtr; 160 | 161 | extern cgiFormResultType cgiFormFileOpen( 162 | char *name, cgiFilePtr *cfpp); 163 | 164 | extern cgiFormResultType cgiFormFileRead( 165 | cgiFilePtr cfp, char *buffer, int bufferSize, int *gotP); 166 | 167 | extern cgiFormResultType cgiFormFileClose( 168 | cgiFilePtr cfp); 169 | 170 | extern cgiFormResultType cgiCookieString( 171 | char *name, char *result, int max); 172 | 173 | extern cgiFormResultType cgiCookieInteger( 174 | char *name, int *result, int defaultV); 175 | 176 | cgiFormResultType cgiCookies( 177 | char ***ptrToStringArray); 178 | 179 | /* path can be null or empty in which case a path of / (entire site) is set. 180 | domain can be a single web site; if it is an entire domain, such as 181 | 'boutell.com', it should begin with a dot: '.boutell.com' */ 182 | extern void cgiHeaderCookieSetString(char *name, char *value, 183 | int secondsToLive, char *path, char *domain); 184 | extern void cgiHeaderCookieSetInteger(char *name, int value, 185 | int secondsToLive, char *path, char *domain); 186 | extern void cgiHeaderLocation(char *redirectUrl); 187 | extern void cgiHeaderStatus(int status, char *statusMessage); 188 | extern void cgiHeaderContentType(char *mimeType); 189 | 190 | typedef enum { 191 | cgiEnvironmentIO, 192 | cgiEnvironmentMemory, 193 | cgiEnvironmentSuccess, 194 | cgiEnvironmentWrongVersion 195 | } cgiEnvironmentResultType; 196 | 197 | extern cgiEnvironmentResultType cgiWriteEnvironment(char *filename); 198 | extern cgiEnvironmentResultType cgiReadEnvironment(char *filename); 199 | 200 | extern int cgiMain(); 201 | 202 | extern cgiFormResultType cgiFormEntries( 203 | char ***ptrToStringArray); 204 | 205 | /* Output string with the <, &, and > characters HTML-escaped. 206 | 's' is null-terminated. Returns cgiFormIO in the event 207 | of error, cgiFormSuccess otherwise. */ 208 | cgiFormResultType cgiHtmlEscape(const char *s); 209 | 210 | /* Output data with the <, &, and > characters HTML-escaped. 211 | 'data' is not null-terminated; 'len' is the number of 212 | bytes in 'data'. Returns cgiFormIO in the event 213 | of error, cgiFormSuccess otherwise. */ 214 | cgiFormResultType cgiHtmlEscapeData(const char *data, int len); 215 | 216 | /* Output string with the " character HTML-escaped, and no 217 | other characters escaped. This is useful when outputting 218 | the contents of a tag attribute such as 'href' or 'src'. 219 | 's' is null-terminated. Returns cgiFormIO in the event 220 | of error, cgiFormSuccess otherwise. */ 221 | cgiFormResultType cgiValueEscape(const char *s); 222 | 223 | /* Output data with the " character HTML-escaped, and no 224 | other characters escaped. This is useful when outputting 225 | the contents of a tag attribute such as 'href' or 'src'. 226 | 'data' is not null-terminated; 'len' is the number of 227 | bytes in 'data'. Returns cgiFormIO in the event 228 | of error, cgiFormSuccess otherwise. */ 229 | cgiFormResultType cgiValueEscapeData(const char *data, int len); 230 | 231 | #endif /* CGI_C */ 232 | 233 | -------------------------------------------------------------------------------- /cgi-bin/config_info.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "cgic.h" 8 | #include "sqlite3.h" 9 | #define SQL_SIZE 256 10 | int cgiMain(int argc, char **argv) 11 | { 12 | char name[64]; 13 | char age[4]; 14 | char sex[8]; 15 | char company[64]; 16 | char profession[16]; 17 | char idnumber[24]; 18 | char qq[24]; 19 | char email[64]; 20 | char telephone[16];//回显信息到HTML网页cgiHeaderContentType("text/html"); 21 | printf("\n\n"); 22 | printf("

\n\n");//获取表单中的name的值,存入name缓冲区 23 | if(cgiFormString("name", name, sizeof(name)) != cgiFormSuccess) 24 | { 25 | fprintf(stderr, "cgiFormString function name failed"); 26 | exit(-1); 27 | } 28 | printf("姓名:%s\n\n",name); 29 | printf("
\n\n"); 30 | if(cgiFormString("age", age, sizeof(age)) != cgiFormSuccess) 31 | { 32 | fprintf(stderr, "cgiFormString function age failed"); 33 | exit(-1); 34 | } 35 | printf("年龄:%s\n\n",age); 36 | printf("
\n\n"); 37 | if(cgiFormString("sex", sex, sizeof(sex)) != cgiFormSuccess) 38 | { 39 | fprintf(stderr, "cgiFormString function sex failed"); 40 | exit(-1); 41 | } 42 | printf("性别:%s\n\n",sex); 43 | printf("
\n\n"); 44 | if(cgiFormString("company", company, sizeof(company)) != cgiFormSuccess) 45 | { 46 | fprintf(stderr, "cgiFormString function company failed"); 47 | exit(-1); 48 | } 49 | printf("单位:%s\n\n",company); 50 | printf("
\n\n"); 51 | if(cgiFormString("profession", profession, sizeof(profession)) != cgiFormSuccess) 52 | { 53 | fprintf(stderr, "cgiFormString function profession failed"); 54 | exit(-1); 55 | } 56 | printf("职业:%s\n\n",profession); 57 | printf("
\n\n"); 58 | if(cgiFormString("idnumber", idnumber, sizeof(idnumber)) != cgiFormSuccess) 59 | { 60 | fprintf(stderr, "cgiFormString function idnumber failed"); 61 | exit(-1); 62 | } 63 | printf("身份证号码:%s\n\n",idnumber); 64 | printf("
\n\n"); 65 | if(cgiFormString("email", email, sizeof(email)) != cgiFormSuccess) 66 | { 67 | fprintf(stderr, "cgiFormString function email failed"); 68 | exit(-1); 69 | } 70 | printf("Email:%s\n\n",email); 71 | printf("
\n\n"); 72 | if(cgiFormString("telephone", telephone, sizeof(telephone)) != cgiFormSuccess) 73 | { 74 | fprintf(stderr, "cgiFormString function telephone failed"); 75 | exit(-1); 76 | } 77 | printf("Telepone:%s\n\n",telephone); 78 | printf("
\n\n"); 79 | if(cgiFormString("qq", qq, sizeof(qq)) != cgiFormSuccess) 80 | { 81 | fprintf(stderr, "cgiFormString function qq failed"); 82 | printf("cgiFormString function qq failed"); 83 | exit(-1); 84 | } 85 | printf("QQ号码:%s\n\n",qq); 86 | printf("
\n\n"); 87 | printf("

\n\n"); 88 | printf("\n\n");//数据存储到数据库 89 | sqlite3 *db; 90 | int result; 91 | result = sqlite3_open("person.db", &db); 92 | if(result != SQLITE_OK) 93 | { 94 | printf("Fail to sqlite3_open person.db: %s.\n", sqlite3_errmsg(db)); 95 | exit(-1); 96 | } 97 | char *errmsg; 98 | char sql[SQL_SIZE]; 99 | bzero(sql, SQL_SIZE); 100 | strcpy(sql, "CREATE TABLE person(ID varchar(24) PRIMARY KEY,name text,age text, sex text, company text, profession text, qq text, email text, telephone text);"); 101 | if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != 0) 102 | { 103 | printf("Fail to exec sql: %s.\n", errmsg); 104 | printf("\n%s\n",sql); 105 | exit(-1); 106 | } 107 | bzero(sql, SQL_SIZE); 108 | strcpy(sql, "INSERT INTO person values('1234567899876543', '天山老妖', '30', 'boy', '天山', '嵌入式工程师', '123455678', 'hello@qq.com', '123344');"); 109 | if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != 0) 110 | { 111 | printf("Fail to exec sql: %s.\n\n", errmsg); 112 | printf("\n%s\n",sql); 113 | exit(-1); 114 | } 115 | result = sqlite3_close(db); 116 | if(result != 0) 117 | { 118 | fprintf(stderr, "Fail to sqlite3_open person.db : %s.\n", sqlite3_errmsg(db)); 119 | exit(-1); 120 | } 121 | return 0; 122 | } 123 | -------------------------------------------------------------------------------- /cgi-bin/config_sql.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include "cgic.h" 10 | //#include "sql.h" 11 | #define SQL_SIZE 256 12 | 13 | int cgiMain(int argc, char **argv) 14 | { 15 | // 存储数据的变量 16 | char name[64]; 17 | char age[4]; 18 | char sex[8]; 19 | char company[64]; 20 | char profession[64]; 21 | char idnumber[24]; 22 | char qq[24]; 23 | char email[64]; 24 | char telephone[16]; 25 | //回显信息到HTML网页cgiHeaderContentType("text/html"); 26 | printf("\n\n"); 27 | printf("\n\n"); 28 | printf("

\n\n"); 29 | 30 | // 获取表单中的name的值,存入name缓冲区 31 | // cgiFormResultType cgiFormString( char *name, char *result, int max) 32 | // cgiFormString试图检索发送给指定字段的字符串。文本会被拷贝到指定的result buffer中,最多但不超过max-1个字节。null字符标记字符串的结束。 33 | if(cgiFormString("name", name, sizeof(name)) != cgiFormSuccess) 34 | { 35 | fprintf(stderr, "cgiFormString function name failed"); 36 | exit(-1); 37 | } 38 | printf("姓名:%s\n\n",name); 39 | printf("
\n\n"); 40 | if(cgiFormString("age", age, sizeof(age)) != cgiFormSuccess) 41 | { 42 | fprintf(stderr, "cgiFormString function age failed"); 43 | exit(-1); 44 | } 45 | printf("年龄:%s\n\n",age); 46 | printf("
\n\n"); 47 | if(cgiFormString("sex", sex, sizeof(sex)) != cgiFormSuccess) 48 | { 49 | fprintf(stderr, "cgiFormString function sex failed"); 50 | exit(-1); 51 | } 52 | printf("性别:%s\n\n",sex); 53 | printf("
\n\n"); 54 | if(cgiFormString("company", company, sizeof(company)) != cgiFormSuccess) 55 | { 56 | fprintf(stderr, "cgiFormString function company failed"); 57 | exit(-1); 58 | } 59 | printf("单位:%s\n\n",company); 60 | printf("
\n\n"); 61 | if(cgiFormString("profession", profession, sizeof(profession)) != cgiFormSuccess) 62 | { 63 | fprintf(stderr, "cgiFormString function profession failed"); 64 | exit(-1); 65 | } 66 | printf("职业:%s\n\n",profession); 67 | printf("
\n\n"); 68 | if(cgiFormString("idnumber", idnumber, sizeof(idnumber)) != cgiFormSuccess) 69 | { 70 | fprintf(stderr, "cgiFormString function idnumber failed"); 71 | exit(-1); 72 | } 73 | printf("身份证号码:%s\n\n",idnumber); 74 | printf("
\n\n"); 75 | if(cgiFormString("qq", qq, sizeof(qq)) != cgiFormSuccess) 76 | { 77 | fprintf(stderr, "cgiFormString function qq failed"); 78 | printf("cgiFormString function qq failed"); 79 | exit(-1); 80 | } 81 | printf("QQ号码:%s\n\n",qq); 82 | printf("
\n\n"); 83 | if(cgiFormString("email", email, sizeof(email)) != cgiFormSuccess) 84 | { 85 | fprintf(stderr, "cgiFormString function email failed"); 86 | exit(-1); 87 | } 88 | printf("Email:%s\n\n",email); 89 | printf("
\n\n"); 90 | if(cgiFormString("telephone", telephone, sizeof(telephone)) != cgiFormSuccess) 91 | { 92 | fprintf(stderr, "cgiFormString function telephone failed"); 93 | exit(-1); 94 | } 95 | printf("Telepone:%s\n\n",telephone); 96 | printf("
\n\n"); 97 | printf("

\n\n"); 98 | printf("\n\n"); 99 | 100 | //数据存储到数据库 101 | MYSQL* conn; 102 | bool isAutoCommit; 103 | 104 | // 初始化 MySQL 105 | conn = mysql_init(NULL); 106 | if(NULL == conn) 107 | { 108 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 109 | exit(-1); 110 | } 111 | 112 | char ip[16] = "127.0.0.1"; 113 | char user[20] = "test"; 114 | char passwd[20] = "test"; 115 | char database[20] = "person"; 116 | int port = 3306; 117 | 118 | // 尝试与运行在主机上的MySQL数据库引擎建立连接 119 | if(NULL == mysql_real_connect(conn,ip,user,passwd,database,port,NULL,0)) 120 | { 121 | printf("---errno:%d error:%s\n\n",mysql_errno(conn),mysql_error(conn)); 122 | exit(-1); 123 | } 124 | 125 | isAutoCommit = true; 126 | // 根据mysql的autocommit参数设置来决定是否自动提交 127 | mysql_autocommit(conn,isAutoCommit); 128 | 129 | // 设定数据库编码 130 | mysql_query(conn,"SET NAMES 'utf8'"); 131 | mysql_query(conn,"SET CHARACTER SET utf8"); 132 | mysql_query(conn,"SET CHARACTER_SET_RESULT = utf8"); 133 | 134 | char cmd[SQL_SIZE]; 135 | // 置字节字符串cmd的前SQL_SIZE个字节为零且包括‘\0’ 136 | bzero(cmd, SQL_SIZE); 137 | // 创建person表 138 | // strcpy(cmd, "CREATE TABLE person(ID varchar(24) PRIMARY KEY,name varchar(64),age varchar(4), sex varchar(8), company varchar(64), profession varchar(64), qq varchar(24), email varchar(64), telephone varchar(16));"); 139 | 140 | // 将sql语句写入cmd变量 141 | sprintf(cmd, "INSERT INTO person values('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s');",idnumber,name,age,sex,company,profession,qq,email,telephone); 142 | 143 | printf("%s\n\n",cmd); 144 | 145 | // 向与指定的连接标识符关联的服务器中的当前活动数据库发送一条查询 146 | if(mysql_query(conn,cmd) != 0) 147 | { 148 | printf("errno:%d error:%s\n\n",mysql_errno(conn),mysql_error(conn)); 149 | exit(-1); 150 | } 151 | //mysql_affected_rows(conn); 152 | 153 | printf("增加成功\n\n"); 154 | 155 | 156 | sprintf(cmd,"select * from person;"); 157 | 158 | MYSQL_RES *res; 159 | MYSQL_ROW row; 160 | 161 | if(mysql_query(conn,cmd) != 0) 162 | { 163 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 164 | return -1; 165 | } 166 | 167 | int num_fields = mysql_field_count(conn); 168 | if(num_fields == 0) 169 | { 170 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 171 | return -1; 172 | } 173 | 174 | res = mysql_store_result(conn); 175 | if(NULL == res) 176 | { 177 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 178 | return -1; 179 | } 180 | 181 | printf("
\n\n"); 182 | while((row = mysql_fetch_row(res))) 183 | { 184 | char arr[1000]; 185 | int i = 0; 186 | for( ; i\n\n"); 192 | } 193 | 194 | mysql_free_result(res); 195 | 196 | 197 | return 0; 198 | } 199 | 200 | -------------------------------------------------------------------------------- /cgi-bin/config编译说明.txt: -------------------------------------------------------------------------------- 1 | ubuntu12.04 2 | 如果是用的SQLite 3 | 4 | gcc -o login.cgi login.c sqlite3.c cgic.c -lsqlite3 -lpthread -ldl 5 | 6 | 7 | 用的MySQL 8 | 9 | gcc -o login.cgi login.c cgic.c -lpthread -ldl -lmysqlclient 10 | -------------------------------------------------------------------------------- /cgi-bin/get.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include "cgic.h" 12 | 13 | int cgiMain(void) 14 | { 15 | char *lenstr; 16 | 17 | if(lenstr=getenv("QUERY_STRING")) 18 | { 19 | } 20 | else 21 | { 22 | } 23 | 24 | printf("Content type: text/html\n\n"); 25 | 26 | if(strstr(lenstr,"get") != NULL) 27 | { 28 | printf("

用p标签是解决有个报错问题, 标签中就是解析后的内容

"); 29 | } 30 | 31 | return 0; 32 | } 33 | 34 | -------------------------------------------------------------------------------- /cgi-bin/get.cgi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ikaros-521/boa_cgi_html_mysql/9b6a309ceca109ce802041f45e6f25aa1075d211/cgi-bin/get.cgi -------------------------------------------------------------------------------- /cgi-bin/getdata.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "cgic.h" 3 | #include 4 | #include 5 | int cgiMain() { 6 | fprintf(cgiOut,"Set-Cookie: %s=%s; path=/\r\n","Data","abcd"); 7 | //设置一个名为Data数据为"abcd"的Cookie 8 | cgiHeaderContentType("text/html"); 9 | fprintf(cgiOut, "\n"); 10 | fprintf(cgiOut, "Cookie\n"); 13 | fprintf(cgiOut, ""); 14 | fprintf(cgiOut, "\n"); 15 | fprintf(cgiOut, "\n"); 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /cgi-bin/ifconfig.c: -------------------------------------------------------------------------------- 1 | /* 2 | sudo vim /etc/network/interfaces 3 | auto eth0 #要设置的网卡 4 | iface eth0 inet static #设置静态IP;如果是使用自动IP用dhcp,后面的不用设置,一般少用 5 | addressxxx.xxx.xxx.xxx #IP地址 6 | netmaskxxx.xxx.xxx.xxx #子网掩码 7 | gatewayxxx.xxx.xxx.xxx #网关 8 | sudo vim /etc/resolvconf/resolv.conf.d/base 9 | search localdomain #如果本Server为DNS服务器,可以加上这一句,如果不是,可以不加 10 | nameserver 172.16.3.4 #希望修改成的DNS 11 | nameserver 172.16.3.3 #希望修改成的DNS 12 | 13 | sudo /etc/init.d/networking restart #使网卡配置生效 14 | sudo /etc/init.d/resolvconf restart #使DNS生效 15 | */ 16 | #include 17 | #include "cgic.h" 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | 25 | int main() 26 | { 27 | system("sudo chmod 777 /etc/network/interfaces"); // 修改文件权限 28 | system("sudo chmod 777 /etc/resolvconf/resolv.conf.d/base"); 29 | int fd_interfaces = open("/etc/network/interfaces",O_RDWR|O_TRUNC); // 打开文件 30 | if(-1 == fd_interfaces) 31 | { 32 | printf("/etc/network/interfaces open failed\n"); 33 | } 34 | 35 | char buf[1024] = {}; // 将配置信息写入字符串,再写入文件 36 | strcpy(buf,"auto lo\niface lo inet loopback\n"); 37 | int size = write(fd_interfaces,buf, strlen(buf)); 38 | strcpy(buf,"auto eth0\niface eth0 inet static\naddress192.168.1.100\nnetmask255.255.255.0\ngateway192.168.1.1\n"); 39 | size = write(fd_interfaces,buf, strlen(buf)); 40 | 41 | int fd_base = open("/etc/resolvconf/resolv.conf.d/base",O_RDWR|O_TRUNC); 42 | strcpy(buf,"search localdomain\nnameserver 172.16.3.4\nnameserver 172.16.3.3"); 43 | size = write(fd_base,buf, strlen(buf)); 44 | 45 | return 0; 46 | 47 | 48 | } 49 | -------------------------------------------------------------------------------- /cgi-bin/login.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include "cgic.h" 11 | 12 | #define SQL_SIZE 256 13 | 14 | int cgiMain(void) 15 | { 16 | char username[20]; 17 | char password[20]; 18 | char email[40]; 19 | //回显信息到HTML网页cgiHeaderContentType("text/html"); 20 | printf("\n\n"); 21 | printf("\n\n"); 22 | printf("

\n\n"); 23 | 24 | if(cgiFormString("username", username, sizeof(username)) != cgiFormSuccess) 25 | { 26 | fprintf(stderr, "cgiFormString function username failed"); 27 | //exit(-1); 28 | } 29 | printf("用户名:%s\n\n",username); 30 | printf("
\n\n"); 31 | // password gateway server_ip dns subnet_mask dhcp error 32 | if(cgiFormString("password", password, sizeof(password)) != cgiFormSuccess) 33 | { 34 | fprintf(stderr, "cgiFormString function password failed"); 35 | //exit(-1); 36 | } 37 | printf("密码:%s\n\n",password); 38 | printf("
\n\n"); 39 | /* 40 | if(cgiFormString("email", email, sizeof(email)) != cgiFormSuccess) 41 | { 42 | fprintf(stderr, "cgiFormString function email failed"); 43 | //exit(-1); 44 | } 45 | printf("电子邮箱:%s\n\n",phone); 46 | printf("
\n\n"); 47 | */ 48 | 49 | /*** 将用户信息写入MySQL数据库中 ***/ 50 | //数据存储到数据库 51 | MYSQL* conn; 52 | bool isAutoCommit; 53 | 54 | // 初始化 MySQL 55 | conn = mysql_init(NULL); 56 | if(NULL == conn) 57 | { 58 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 59 | exit(-1); 60 | } 61 | 62 | char ip[16] = "127.0.0.1"; 63 | char user[20] = "test"; 64 | char passwd[20] = "test"; 65 | char database[20] = "register"; 66 | int port = 3306; 67 | 68 | // 尝试与运行在主机上的MySQL数据库引擎建立连接 69 | if(NULL == mysql_real_connect(conn,ip,user,passwd,database,port,NULL,0)) 70 | { 71 | printf("---errno:%d error:%s\n\n",mysql_errno(conn),mysql_error(conn)); 72 | exit(-1); 73 | } 74 | 75 | isAutoCommit = true; 76 | // 根据mysql的autocommit参数设置来决定是否自动提交 77 | mysql_autocommit(conn,isAutoCommit); 78 | 79 | // 设定数据库编码 80 | mysql_query(conn,"SET NAMES 'utf8'"); 81 | mysql_query(conn,"SET CHARACTER SET utf8"); 82 | mysql_query(conn,"SET CHARACTER_SET_RESULT = utf8"); 83 | 84 | char cmd[SQL_SIZE]; 85 | // 置字节字符串cmd的前SQL_SIZE个字节为零且包括‘\0’ 86 | bzero(cmd, SQL_SIZE); 87 | // 创建user表 88 | // strcpy(cmd, "CREATE TABLE user(username varchar(20) PRIMARY KEY,password varchar(20));"); 89 | 90 | // 将sql语句写入cmd变量 91 | sprintf(cmd, "select * from user where username='%s' and password='%s';",username,password); 92 | 93 | MYSQL_RES *res; 94 | MYSQL_ROW row; 95 | 96 | // 向与指定的连接标识符关联的服务器中的当前活动数据库发送一条查询 97 | if(mysql_query(conn,cmd) != 0) 98 | { 99 | printf("errno:%d error:%s\n\n",mysql_errno(conn),mysql_error(conn)); 100 | exit(-1); 101 | } 102 | 103 | int num_fields = mysql_field_count(conn); 104 | if(num_fields == 0) 105 | { 106 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 107 | return -1; 108 | } 109 | 110 | res = mysql_store_result(conn); 111 | if(NULL == res) 112 | { 113 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 114 | return -1; 115 | } 116 | 117 | printf("
\n\n"); 118 | printf("
\n\n"); 119 | int count = 0; 120 | while((row = mysql_fetch_row(res))) 121 | { 122 | char arr[1000]; 123 | int i = 0; 124 | for( ; i\n\n"); 130 | count++; 131 | } 132 | mysql_free_result(res); 133 | 134 | if(count != 0) 135 | { 136 | printf("

登陆成功

\n\n"); 137 | sleep(1); 138 | printf("\n"); 139 | } 140 | else 141 | { 142 | printf("

帐号或密码错误

\n\n"); 143 | sleep(1); 144 | printf("\n"); 145 | } 146 | 147 | //printf("

\n\n"); 148 | 149 | return 0; 150 | } 151 | -------------------------------------------------------------------------------- /cgi-bin/login.cgi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ikaros-521/boa_cgi_html_mysql/9b6a309ceca109ce802041f45e6f25aa1075d211/cgi-bin/login.cgi -------------------------------------------------------------------------------- /cgi-bin/person.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ikaros-521/boa_cgi_html_mysql/9b6a309ceca109ce802041f45e6f25aa1075d211/cgi-bin/person.db -------------------------------------------------------------------------------- /cgi-bin/register.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "cgic.h" 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #define SQL_SIZE 256 13 | 14 | int cgiMain(void) 15 | { 16 | char username[20]; 17 | char password[20]; 18 | char email[40]; 19 | //回显信息到HTML网页cgiHeaderContentType("text/html"); 20 | printf("\n\n"); 21 | printf("\n\n"); 22 | printf("

\n\n"); 23 | 24 | if(cgiFormString("username", username, sizeof(username)) != cgiFormSuccess) 25 | { 26 | fprintf(stderr, "cgiFormString function username failed"); 27 | //exit(-1); 28 | } 29 | printf("用户名:%s\n\n",username); 30 | printf("
\n\n"); 31 | // password gateway server_ip dns subnet_mask dhcp error 32 | if(cgiFormString("password", password, sizeof(password)) != cgiFormSuccess) 33 | { 34 | fprintf(stderr, "cgiFormString function password failed"); 35 | //exit(-1); 36 | } 37 | printf("密码:%s\n\n",password); 38 | printf("
\n\n"); 39 | /* 40 | if(cgiFormString("email", email, sizeof(email)) != cgiFormSuccess) 41 | { 42 | fprintf(stderr, "cgiFormString function email failed"); 43 | //exit(-1); 44 | } 45 | printf("电子邮箱:%s\n\n",phone); 46 | printf("
\n\n"); 47 | */ 48 | 49 | /*** 将用户信息写入MySQL数据库中 ***/ 50 | //数据存储到数据库 51 | MYSQL* conn; 52 | bool isAutoCommit; 53 | 54 | // 初始化 MySQL 55 | conn = mysql_init(NULL); 56 | if(NULL == conn) 57 | { 58 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 59 | exit(-1); 60 | } 61 | 62 | char ip[16] = "127.0.0.1"; 63 | char user[20] = "test"; 64 | char passwd[20] = "test"; 65 | char database[20] = "register"; 66 | int port = 3306; 67 | 68 | // 尝试与运行在主机上的MySQL数据库引擎建立连接 69 | if(NULL == mysql_real_connect(conn,ip,user,passwd,database,port,NULL,0)) 70 | { 71 | printf("---errno:%d error:%s\n\n",mysql_errno(conn),mysql_error(conn)); 72 | exit(-1); 73 | } 74 | 75 | isAutoCommit = true; 76 | // 根据mysql的autocommit参数设置来决定是否自动提交 77 | mysql_autocommit(conn,isAutoCommit); 78 | 79 | // 设定数据库编码 80 | mysql_query(conn,"SET NAMES 'utf8'"); 81 | mysql_query(conn,"SET CHARACTER SET utf8"); 82 | mysql_query(conn,"SET CHARACTER_SET_RESULT = utf8"); 83 | 84 | char cmd[SQL_SIZE]; 85 | // 置字节字符串cmd的前SQL_SIZE个字节为零且包括‘\0’ 86 | bzero(cmd, SQL_SIZE); 87 | // 创建user表 88 | // strcpy(cmd, "CREATE TABLE user(username varchar(20) PRIMARY KEY,password varchar(20));"); 89 | 90 | // 将sql语句写入cmd变量 91 | sprintf(cmd, "INSERT INTO user values('%s', '%s');",username,password); 92 | 93 | printf("%s\n\n",cmd); 94 | 95 | // 向与指定的连接标识符关联的服务器中的当前活动数据库发送一条查询 96 | if(mysql_query(conn,cmd) != 0) 97 | { 98 | printf("errno:%d error:%s\n\n",mysql_errno(conn),mysql_error(conn)); 99 | printf("

注册失败,请重新注册

\n\n"); 100 | sleep(1); 101 | printf("\n"); 102 | } 103 | //mysql_affected_rows(conn); 104 | 105 | printf("

注册成功

\n\n"); 106 | printf("
\n\n"); 107 | printf("

您的用户名和密码为:

\n\n"); 108 | 109 | sprintf(cmd,"select * from user;"); 110 | 111 | MYSQL_RES *res; 112 | MYSQL_ROW row; 113 | 114 | if(mysql_query(conn,cmd) != 0) 115 | { 116 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 117 | return -1; 118 | } 119 | 120 | int num_fields = mysql_field_count(conn); 121 | if(num_fields == 0) 122 | { 123 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 124 | return -1; 125 | } 126 | 127 | res = mysql_store_result(conn); 128 | if(NULL == res) 129 | { 130 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 131 | return -1; 132 | } 133 | 134 | printf("
\n\n"); 135 | printf("
\n\n"); 136 | while((row = mysql_fetch_row(res))) 137 | { 138 | char arr[1000]; 139 | int i = 0; 140 | for( ; i\n\n"); 146 | } 147 | 148 | mysql_free_result(res); 149 | 150 | sleep(1); 151 | 152 | printf("\n"); 153 | 154 | return 0; 155 | } 156 | -------------------------------------------------------------------------------- /cgi-bin/register.cgi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ikaros-521/boa_cgi_html_mysql/9b6a309ceca109ce802041f45e6f25aa1075d211/cgi-bin/register.cgi -------------------------------------------------------------------------------- /cgi-bin/sql.c: -------------------------------------------------------------------------------- 1 | #include "sql.h" 2 | #include 3 | 4 | SQL::SQL(void) 5 | { 6 | conn = mysql_init(NULL); 7 | if(NULL == conn) 8 | { 9 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 10 | } 11 | } 12 | 13 | SQL::SQL(const char* ip,const char* user,const char* passwd,const char* database,uint16_t port) 14 | { 15 | conn = mysql_init(NULL); 16 | if(NULL == conn) 17 | { 18 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 19 | return; 20 | } 21 | 22 | connect(ip,user,passwd,database,port); 23 | } 24 | 25 | SQL::~SQL(void) 26 | { 27 | 28 | } 29 | 30 | bool SQL::connect(const char* ip,const char* user,const char* passwd,const char* database,uint16_t port) 31 | { 32 | if(NULL == mysql_real_connect(conn,ip,user,passwd,database,port,NULL,0)) 33 | { 34 | printf("---errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 35 | return false; 36 | } 37 | 38 | onAutoCommit(); 39 | 40 | return true; 41 | } 42 | 43 | void SQL::clearResult(void) 44 | { 45 | for(vector >::iterator it = result.begin(); it!=result.end(); it++) 46 | { 47 | it->clear(); 48 | } 49 | 50 | result.clear(); 51 | } 52 | 53 | void SQL::showResult(void) 54 | { 55 | for(vector >::iterator i = result.begin(); i!=result.end(); i++) 56 | { 57 | for(vector::iterator j=i->begin(); j!=i->end(); j++) 58 | { 59 | cout << setw(12) << *j << " "; 60 | } 61 | cout << endl; 62 | } 63 | } 64 | 65 | int SQL::insert(const char* cmd) 66 | { 67 | if(mysql_query(conn,cmd) != 0) 68 | { 69 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 70 | return -1; 71 | } 72 | 73 | return mysql_affected_rows(conn); 74 | } 75 | 76 | int SQL::remove(const char* cmd) 77 | { 78 | if(mysql_query(conn,cmd) != 0) 79 | { 80 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 81 | return -1; 82 | } 83 | 84 | return mysql_affected_rows(conn); 85 | } 86 | 87 | int SQL::update(const char* cmd) 88 | { 89 | if(mysql_query(conn,cmd) != 0) 90 | { 91 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 92 | return -1; 93 | } 94 | 95 | return mysql_affected_rows(conn); 96 | } 97 | 98 | int SQL::select(const char* cmd) 99 | { 100 | MYSQL_RES *res; 101 | MYSQL_ROW row; 102 | 103 | if(mysql_query(conn,cmd) != 0) 104 | { 105 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 106 | return -1; 107 | } 108 | 109 | int num_fields = mysql_field_count(conn); 110 | if(num_fields == 0) 111 | { 112 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 113 | return -1; 114 | } 115 | 116 | res = mysql_store_result(conn); 117 | if(NULL == res) 118 | { 119 | printf("errno:%d error:%s\n",mysql_errno(conn),mysql_error(conn)); 120 | return -1; 121 | } 122 | 123 | clearResult(); 124 | 125 | int count = 0; 126 | while((row = mysql_fetch_row(res))) 127 | { 128 | vector arr; 129 | for(int i=0; i 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | using namespace std; 11 | 12 | class SQL 13 | { 14 | MYSQL* conn; 15 | bool isAutoCommit; 16 | vector > result; 17 | 18 | public: 19 | SQL(void); 20 | 21 | SQL(const char* ip,const char* user,const char* passwd,const char* database,uint16_t port); 22 | 23 | ~SQL(void); 24 | 25 | bool connect(const char* ip,const char* user,const char* passwd,const char* database,uint16_t port); 26 | 27 | int insert(const char* cmd); 28 | int remove(const char* cmd); 29 | int update(const char* cmd); 30 | int select(const char* cmd); 31 | 32 | void clearResult(void); 33 | 34 | void showResult(void); 35 | 36 | bool offAutoCommit(void); 37 | bool onAutoCommit(void); 38 | bool getAutoCommit(void); 39 | }; 40 | 41 | #endif//SQL_H 42 | -------------------------------------------------------------------------------- /cgi-bin/upload.c: -------------------------------------------------------------------------------- 1 | // 编译 gcc upload.c cgic.c -o upload.cgi 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include "cgic.h" 10 | 11 | #define BufferLen 1024 12 | 13 | int cgiMain(void) 14 | { 15 | cgiFilePtr file; 16 | int targetFile = 0; 17 | mode_t mode; 18 | char name[128] = {}; 19 | char fileNameOnServer[64] = {}; 20 | char buf[1024] = {}; 21 | char buf2[1024] = {}; 22 | char contentType[1024] = {}; 23 | char buffer[BufferLen]; 24 | char *tmpStr = NULL; 25 | int size = 0; 26 | int got = 0, t = 0; 27 | 28 | cgiHeaderContentType("text/html"); 29 | 30 | //取得html页面中file元素的值,应该是文件在客户机上的路径名 31 | if (cgiFormFileName("file", name, sizeof(name)) != cgiFormSuccess) 32 | { 33 | //fprintf(stderr,"could not retrieve filename\n"); 34 | printf("could not retrieve filename\n"); 35 | goto FAIL; 36 | } 37 | cgiFormFileSize("file", &size); 38 | //取得文件类型,不过本例中并未使用 39 | cgiFormFileContentType("file", contentType, sizeof(contentType)); 40 | //目前文件存在于系统临时文件夹中,通常为/tmp,通过该命令打开临时文件。临时文件的名字与用户文件的名字不同,所以不能通过路径/tmp/userfilename的方式获得文件 41 | if (cgiFormFileOpen("file", &file) != cgiFormSuccess) 42 | { 43 | //fprintf(stderr,"could not open the file\n"); 44 | printf("could not open the file\n"); 45 | goto FAIL; 46 | } 47 | t = -1; 48 | //从路径名解析出用户文件名 49 | while (1) 50 | { 51 | tmpStr = strstr(name + t + 1, "//"); 52 | if (NULL == tmpStr) 53 | tmpStr = strstr(name + t + 1, "/"); //if "//" is not path separator, try "/" 54 | if (NULL != tmpStr) 55 | t = (int)(tmpStr - name); 56 | else 57 | break; 58 | } 59 | strcpy(fileNameOnServer, name + t + 1); 60 | 61 | mode = S_IRWXU | S_IRGRP | S_IROTH; 62 | //在当前目录下建立新的文件,第一个参数实际上是路径名,此处的含义是在cgi程序所在的目录(当前目录))建立新文件 63 | snprintf(buf, 200, "/var/www/cgi-bin/%s", fileNameOnServer); 64 | 65 | targetFile = open(buf, O_RDWR | O_CREAT | O_TRUNC | O_APPEND, mode); 66 | if (targetFile < 0) 67 | { 68 | //fprintf(stderr,"could not create the new file,%s\n",fileNameOnServer); 69 | snprintf(buf2, 1000, "could not create the new file,%s\n", fileNameOnServer); 70 | printf(buf2); 71 | goto FAIL; 72 | } 73 | //从系统临时文件中读出文件内容,并放到刚创建的目标文件中 74 | while (cgiFormFileRead(file, buffer, BufferLen, &got) == cgiFormSuccess) 75 | { 76 | if (got > 0) 77 | write(targetFile, buffer, got); 78 | } 79 | cgiFormFileClose(file); 80 | close(targetFile); 81 | goto END; 82 | FAIL: 83 | //fprintf(stderr,"Failed to upload"); 84 | printf("Failed to upload\n"); 85 | return 1; 86 | END: 87 | snprintf(buf2, 1000, "File %s has been uploaded\n", fileNameOnServer); 88 | printf(buf2); 89 | // dos2unix filename (windows上传上来的文件换行不一样) 90 | return 0; 91 | } 92 | -------------------------------------------------------------------------------- /cgi-bin/upload.cgi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ikaros-521/boa_cgi_html_mysql/9b6a309ceca109ce802041f45e6f25aa1075d211/cgi-bin/upload.cgi -------------------------------------------------------------------------------- /cgi-bin/upload2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "cgic.h" 8 | 9 | #define BufferLen 1024 10 | 11 | int cgiMain(void) 12 | { 13 | cgiFilePtr file; 14 | int targetFile; 15 | mode_t mode; 16 | char name[128] = {}; 17 | char fileNameOnServer[64] = {}; 18 | char buf[1024] = {}; 19 | char contentType[1024] = {}; 20 | char buffer[BufferLen]; 21 | char *tmpStr = NULL; 22 | int size; 23 | int got,t; 24 | cgiHeaderContentType("text/html"); //取得html页面中file元素的值,应该是文件在客户机上的路径名 25 | 26 | if (cgiFormFileName("file", name, sizeof(name)) !=cgiFormSuccess) 27 | { 28 | //fprintf(stderr,"could not retrieve filename\n"); 29 | printf("could not retrieve filename\n"); 30 | goto FAIL; 31 | } 32 | cgiFormFileSize("file", &size); //取得文件类型,不过本例中并未使用 33 | 34 | cgiFormFileContentType("file", contentType,sizeof(contentType)); 35 | //目前文件存在于系统临时文件夹中,通常为/tmp,通过该命令打开临时文件。临时文件的名字与用户文件的名字不同,所以不能通过路径/tmp/userfilename的方式获得文件 36 | if(cgiFormFileOpen("file", &file) != cgiFormSuccess) 37 | { 38 | //fprintf(stderr,"could not open the file\n"); 39 | printf("could not open the file\n"); 40 | goto FAIL; 41 | } 42 | t=-1; //从路径名解析出用户文件名 43 | while(1) 44 | { 45 | tmpStr = strstr(name+t+1,"//"); 46 | if(NULL == tmpStr) 47 | tmpStr = strstr(name+t+1,"/");//if "//" is not path separator, try "/" 48 | if(NULL != tmpStr) 49 | t = (int)(tmpStr-name); 50 | else 51 | break; 52 | } 53 | strcpy(fileNameOnServer,name+t+1); 54 | mode = S_IRWXU|S_IRGRP|S_IROTH; //在当前目录下建立新的文件,第一个参数实际上是路径名,此处的含义是在cgi程序所在的目录(当前目录))建立新文件 55 | sprintf(buf, "/root/%s", fileNameOnServer); 56 | targetFile = open(buf, O_RDWR|O_CREAT|O_TRUNC|O_APPEND, mode); 57 | if(targetFile<0) 58 | { 59 | //fprintf(stderr,"could not create the new file,%s\n",fileNameOnServer); 60 | printf("could not create the new file,%s\n",fileNameOnServer); 61 | goto FAIL; 62 | } //从系统临时文件中读出文件内容,并放到刚创建的目标文件中 63 | while(cgiFormFileRead(file, buffer, BufferLen, &got)==cgiFormSuccess) 64 | { 65 | if(got>0) 66 | write(targetFile,buffer,got); 67 | } 68 | cgiFormFileClose(file); 69 | close(targetFile); 70 | goto END; 71 | FAIL: 72 | //fprintf(stderr,"Failed to upload"); 73 | printf("Failed to upload\n"); 74 | return 1; 75 | END: 76 | printf("File %s has been uploaded\n",fileNameOnServer); 77 | // sudo dos2unix filename (windows上传上来的文件换行不一样) 78 | 79 | return 0; 80 | } 81 | -------------------------------------------------------------------------------- /css/bootstrap-grid.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Grid v4.3.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 The Bootstrap Authors 4 | * Copyright 2011-2019 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | */html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{box-sizing:inherit}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}} 7 | /*# sourceMappingURL=bootstrap-grid.min.css.map */ -------------------------------------------------------------------------------- /css/bootstrap-reboot.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 The Bootstrap Authors 4 | * Copyright 2011-2019 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */ 8 | *, 9 | *::before, 10 | *::after { 11 | box-sizing: border-box; 12 | } 13 | 14 | html { 15 | font-family: sans-serif; 16 | line-height: 1.15; 17 | -webkit-text-size-adjust: 100%; 18 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 19 | } 20 | 21 | article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { 22 | display: block; 23 | } 24 | 25 | body { 26 | margin: 0; 27 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 28 | font-size: 1rem; 29 | font-weight: 400; 30 | line-height: 1.5; 31 | color: #212529; 32 | text-align: left; 33 | background-color: #fff; 34 | } 35 | 36 | [tabindex="-1"]:focus { 37 | outline: 0 !important; 38 | } 39 | 40 | hr { 41 | box-sizing: content-box; 42 | height: 0; 43 | overflow: visible; 44 | } 45 | 46 | h1, h2, h3, h4, h5, h6 { 47 | margin-top: 0; 48 | margin-bottom: 0.5rem; 49 | } 50 | 51 | p { 52 | margin-top: 0; 53 | margin-bottom: 1rem; 54 | } 55 | 56 | abbr[title], 57 | abbr[data-original-title] { 58 | text-decoration: underline; 59 | -webkit-text-decoration: underline dotted; 60 | text-decoration: underline dotted; 61 | cursor: help; 62 | border-bottom: 0; 63 | -webkit-text-decoration-skip-ink: none; 64 | text-decoration-skip-ink: none; 65 | } 66 | 67 | address { 68 | margin-bottom: 1rem; 69 | font-style: normal; 70 | line-height: inherit; 71 | } 72 | 73 | ol, 74 | ul, 75 | dl { 76 | margin-top: 0; 77 | margin-bottom: 1rem; 78 | } 79 | 80 | ol ol, 81 | ul ul, 82 | ol ul, 83 | ul ol { 84 | margin-bottom: 0; 85 | } 86 | 87 | dt { 88 | font-weight: 700; 89 | } 90 | 91 | dd { 92 | margin-bottom: .5rem; 93 | margin-left: 0; 94 | } 95 | 96 | blockquote { 97 | margin: 0 0 1rem; 98 | } 99 | 100 | b, 101 | strong { 102 | font-weight: bolder; 103 | } 104 | 105 | small { 106 | font-size: 80%; 107 | } 108 | 109 | sub, 110 | sup { 111 | position: relative; 112 | font-size: 75%; 113 | line-height: 0; 114 | vertical-align: baseline; 115 | } 116 | 117 | sub { 118 | bottom: -.25em; 119 | } 120 | 121 | sup { 122 | top: -.5em; 123 | } 124 | 125 | a { 126 | color: #007bff; 127 | text-decoration: none; 128 | background-color: transparent; 129 | } 130 | 131 | a:hover { 132 | color: #0056b3; 133 | text-decoration: underline; 134 | } 135 | 136 | a:not([href]):not([tabindex]) { 137 | color: inherit; 138 | text-decoration: none; 139 | } 140 | 141 | a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { 142 | color: inherit; 143 | text-decoration: none; 144 | } 145 | 146 | a:not([href]):not([tabindex]):focus { 147 | outline: 0; 148 | } 149 | 150 | pre, 151 | code, 152 | kbd, 153 | samp { 154 | font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 155 | font-size: 1em; 156 | } 157 | 158 | pre { 159 | margin-top: 0; 160 | margin-bottom: 1rem; 161 | overflow: auto; 162 | } 163 | 164 | figure { 165 | margin: 0 0 1rem; 166 | } 167 | 168 | img { 169 | vertical-align: middle; 170 | border-style: none; 171 | } 172 | 173 | svg { 174 | overflow: hidden; 175 | vertical-align: middle; 176 | } 177 | 178 | table { 179 | border-collapse: collapse; 180 | } 181 | 182 | caption { 183 | padding-top: 0.75rem; 184 | padding-bottom: 0.75rem; 185 | color: #6c757d; 186 | text-align: left; 187 | caption-side: bottom; 188 | } 189 | 190 | th { 191 | text-align: inherit; 192 | } 193 | 194 | label { 195 | display: inline-block; 196 | margin-bottom: 0.5rem; 197 | } 198 | 199 | button { 200 | border-radius: 0; 201 | } 202 | 203 | button:focus { 204 | outline: 1px dotted; 205 | outline: 5px auto -webkit-focus-ring-color; 206 | } 207 | 208 | input, 209 | button, 210 | select, 211 | optgroup, 212 | textarea { 213 | margin: 0; 214 | font-family: inherit; 215 | font-size: inherit; 216 | line-height: inherit; 217 | } 218 | 219 | button, 220 | input { 221 | overflow: visible; 222 | } 223 | 224 | button, 225 | select { 226 | text-transform: none; 227 | } 228 | 229 | select { 230 | word-wrap: normal; 231 | } 232 | 233 | button, 234 | [type="button"], 235 | [type="reset"], 236 | [type="submit"] { 237 | -webkit-appearance: button; 238 | } 239 | 240 | button:not(:disabled), 241 | [type="button"]:not(:disabled), 242 | [type="reset"]:not(:disabled), 243 | [type="submit"]:not(:disabled) { 244 | cursor: pointer; 245 | } 246 | 247 | button::-moz-focus-inner, 248 | [type="button"]::-moz-focus-inner, 249 | [type="reset"]::-moz-focus-inner, 250 | [type="submit"]::-moz-focus-inner { 251 | padding: 0; 252 | border-style: none; 253 | } 254 | 255 | input[type="radio"], 256 | input[type="checkbox"] { 257 | box-sizing: border-box; 258 | padding: 0; 259 | } 260 | 261 | input[type="date"], 262 | input[type="time"], 263 | input[type="datetime-local"], 264 | input[type="month"] { 265 | -webkit-appearance: listbox; 266 | } 267 | 268 | textarea { 269 | overflow: auto; 270 | resize: vertical; 271 | } 272 | 273 | fieldset { 274 | min-width: 0; 275 | padding: 0; 276 | margin: 0; 277 | border: 0; 278 | } 279 | 280 | legend { 281 | display: block; 282 | width: 100%; 283 | max-width: 100%; 284 | padding: 0; 285 | margin-bottom: .5rem; 286 | font-size: 1.5rem; 287 | line-height: inherit; 288 | color: inherit; 289 | white-space: normal; 290 | } 291 | 292 | progress { 293 | vertical-align: baseline; 294 | } 295 | 296 | [type="number"]::-webkit-inner-spin-button, 297 | [type="number"]::-webkit-outer-spin-button { 298 | height: auto; 299 | } 300 | 301 | [type="search"] { 302 | outline-offset: -2px; 303 | -webkit-appearance: none; 304 | } 305 | 306 | [type="search"]::-webkit-search-decoration { 307 | -webkit-appearance: none; 308 | } 309 | 310 | ::-webkit-file-upload-button { 311 | font: inherit; 312 | -webkit-appearance: button; 313 | } 314 | 315 | output { 316 | display: inline-block; 317 | } 318 | 319 | summary { 320 | display: list-item; 321 | cursor: pointer; 322 | } 323 | 324 | template { 325 | display: none; 326 | } 327 | 328 | [hidden] { 329 | display: none !important; 330 | } 331 | /*# sourceMappingURL=bootstrap-reboot.css.map */ -------------------------------------------------------------------------------- /css/bootstrap-reboot.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 The Bootstrap Authors 4 | * Copyright 2011-2019 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important} 8 | /*# sourceMappingURL=bootstrap-reboot.min.css.map */ -------------------------------------------------------------------------------- /css/bootstrap-reboot.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../../scss/bootstrap-reboot.scss","../../scss/_reboot.scss","dist/css/bootstrap-reboot.css","../../scss/vendor/_rfs.scss","bootstrap-reboot.css","../../scss/mixins/_hover.scss"],"names":[],"mappings":"AAAA;;;;;;ACkBA,ECTA,QADA,SDaE,WAAA,WAGF,KACE,YAAA,WACA,YAAA,KACA,yBAAA,KACA,4BAAA,YAMF,QAAA,MAAA,WAAA,OAAA,OAAA,OAAA,OAAA,KAAA,IAAA,QACE,QAAA,MAUF,KACE,OAAA,EACA,YAAA,aAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,WAAA,CAAA,UAAA,CAAA,mBAAA,CAAA,gBAAA,CAAA,iBAAA,CAAA,mBEgFI,UAAA,KF9EJ,YAAA,IACA,YAAA,IACA,MAAA,QACA,WAAA,KACA,iBAAA,KGlBF,sBH2BE,QAAA,YASF,GACE,WAAA,YACA,OAAA,EACA,SAAA,QAaF,GAAA,GAAA,GAAA,GAAA,GAAA,GACE,WAAA,EACA,cAAA,MAOF,EACE,WAAA,EACA,cAAA,KC1CF,0BDqDA,YAEE,gBAAA,UACA,wBAAA,UAAA,OAAA,gBAAA,UAAA,OACA,OAAA,KACA,cAAA,EACA,iCAAA,KAAA,yBAAA,KAGF,QACE,cAAA,KACA,WAAA,OACA,YAAA,QC/CF,GDkDA,GCnDA,GDsDE,WAAA,EACA,cAAA,KAGF,MClDA,MACA,MAFA,MDuDE,cAAA,EAGF,GACE,YAAA,IAGF,GACE,cAAA,MACA,YAAA,EAGF,WACE,OAAA,EAAA,EAAA,KAGF,ECnDA,ODqDE,YAAA,OAGF,MEpFI,UAAA,IF6FJ,ICxDA,ID0DE,SAAA,SE/FE,UAAA,IFiGF,YAAA,EACA,eAAA,SAGF,IAAM,OAAA,OACN,IAAM,IAAA,MAON,EACE,MAAA,QACA,gBAAA,KACA,iBAAA,YI5KA,QJ+KE,MAAA,QACA,gBAAA,UAUJ,8BACE,MAAA,QACA,gBAAA,KIxLA,oCAAA,oCJ2LE,MAAA,QACA,gBAAA,KANJ,oCAUI,QAAA,EC1DJ,KACA,IDkEA,ICjEA,KDqEE,YAAA,cAAA,CAAA,KAAA,CAAA,MAAA,CAAA,QAAA,CAAA,iBAAA,CAAA,aAAA,CAAA,UErJE,UAAA,IFyJJ,IAEE,WAAA,EAEA,cAAA,KAEA,SAAA,KAQF,OAEE,OAAA,EAAA,EAAA,KAQF,IACE,eAAA,OACA,aAAA,KAGF,IAGE,SAAA,OACA,eAAA,OAQF,MACE,gBAAA,SAGF,QACE,YAAA,OACA,eAAA,OACA,MAAA,QACA,WAAA,KACA,aAAA,OAGF,GAGE,WAAA,QAQF,MAEE,QAAA,aACA,cAAA,MAMF,OAEE,cAAA,EAOF,aACE,QAAA,IAAA,OACA,QAAA,IAAA,KAAA,yBCrGF,ODwGA,MCtGA,SADA,OAEA,SD0GE,OAAA,EACA,YAAA,QEtPE,UAAA,QFwPF,YAAA,QAGF,OCxGA,MD0GE,SAAA,QAGF,OCxGA,OD0GE,eAAA,KAMF,OACE,UAAA,OCxGF,cACA,aACA,cD6GA,OAIE,mBAAA,OC5GF,6BACA,4BACA,6BD+GE,sBAKI,OAAA,QC/GN,gCACA,+BACA,gCDmHA,yBAIE,QAAA,EACA,aAAA,KClHF,qBDqHA,kBAEE,WAAA,WACA,QAAA,EAIF,iBCrHA,2BACA,kBAFA,iBD+HE,mBAAA,QAGF,SACE,SAAA,KAEA,OAAA,SAGF,SAME,UAAA,EAEA,QAAA,EACA,OAAA,EACA,OAAA,EAKF,OACE,QAAA,MACA,MAAA,KACA,UAAA,KACA,QAAA,EACA,cAAA,MElSI,UAAA,OFoSJ,YAAA,QACA,MAAA,QACA,YAAA,OAGF,SACE,eAAA,SGpIF,yCFGA,yCDuIE,OAAA,KGrIF,cH6IE,eAAA,KACA,mBAAA,KGzIF,yCHiJE,mBAAA,KAQF,6BACE,KAAA,QACA,mBAAA,OAOF,OACE,QAAA,aAGF,QACE,QAAA,UACA,OAAA,QAGF,SACE,QAAA,KGtJF,SH4JE,QAAA","sourcesContent":["/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"reboot\";\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `` alignment by inheriting from the ``, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `

`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n"]} -------------------------------------------------------------------------------- /css/config.css: -------------------------------------------------------------------------------- 1 | .box ul { 2 | list-style-type: none; 3 | margin:0px; 4 | padding:0px; 5 | } 6 | .box li { 7 | margin:7px; 8 | padding:5px; 9 | float:left; 10 | width:250px; 11 | height:120px; 12 | } 13 | 14 | .form-control { 15 | display: inline; 16 | width: 50%; 17 | } 18 | 19 | .banner { 20 | height:50px; 21 | } 22 | 23 | body { 24 | background-image: url(../img/config_bg.jpg); 25 | background-repeat:no-repeat; 26 | background-attachment:fixed; 27 | width: 100%; 28 | height: 100%; 29 | } 30 | 31 | #center { 32 | margin: 0 auto; 33 | height: auto; 34 | width: 1220px; 35 | text-align: center; 36 | overflow: hidden; 37 | padding: 30px; 38 | } 39 | 40 | .col-sm-2 { 41 | max-width: 30%; 42 | } 43 | 44 | #radio_btn { 45 | width: 100px; 46 | } 47 | 48 | #btn { 49 | padding: 20px; 50 | } 51 | 52 | #Button 53 | { 54 | width:200px; 55 | } 56 | 57 | #passwordeye { 58 | background-color: white; 59 | } 60 | 61 | .input-group 62 | { 63 | padding:20px; 64 | } 65 | 66 | .footer { 67 | left: 40%; 68 | width: 100%; 69 | position: fixed; 70 | bottom: 0; 71 | } 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /css/jquery-ui.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.11.4 - 2016-05-24 2 | * http://jqueryui.com 3 | * Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css 4 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px 5 | * Copyright jQuery Foundation and other contributors; Licensed MIT */ 6 | 7 | .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#2b2b2b;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:0 0 0 0;padding:5px;background:#666;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} -------------------------------------------------------------------------------- /css/login.css: -------------------------------------------------------------------------------- 1 | .bg { 2 | position: absolute; 3 | top: 0; 4 | left: 0; 5 | width: 100%; 6 | height: 100%; 7 | z-index: -1; 8 | } 9 | 10 | #center { 11 | margin: 0 auto; 12 | height: 500px; 13 | width: 700px; 14 | text-align: center; 15 | overflow: hidden; 16 | padding: 20px; 17 | } 18 | 19 | #btn { 20 | padding: 20px; 21 | } 22 | 23 | #Button 24 | { 25 | width:200px; 26 | } 27 | 28 | #passwordeye { 29 | background-color: white; 30 | } 31 | 32 | .input-group 33 | { 34 | padding:20px; 35 | } 36 | 37 | .footer { 38 | left: 40%; 39 | width: 100%; 40 | position: fixed; 41 | bottom: 0; 42 | } 43 | 44 | 45 | -------------------------------------------------------------------------------- /css/register.css: -------------------------------------------------------------------------------- 1 | .bg { 2 | position: absolute; 3 | top: 0; 4 | left: 0; 5 | width: 100%; 6 | height: 100%; 7 | z-index: -1; 8 | } 9 | 10 | #center { 11 | margin: 0 auto; 12 | height: 500px; 13 | width: 700px; 14 | text-align: center; 15 | overflow: hidden; 16 | padding: 20px; 17 | } 18 | 19 | #btn { 20 | padding: 20px; 21 | } 22 | 23 | #Button 24 | { 25 | width:200px; 26 | } 27 | 28 | #passwordeye { 29 | background-color: white; 30 | } 31 | 32 | #passwordeye2 { 33 | background-color: white; 34 | } 35 | 36 | .input-group 37 | { 38 | padding:20px; 39 | } 40 | 41 | .footer { 42 | left: 40%; 43 | width: 100%; 44 | position: fixed; 45 | bottom: 0; 46 | } 47 | 48 | -------------------------------------------------------------------------------- /img/config_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ikaros-521/boa_cgi_html_mysql/9b6a309ceca109ce802041f45e6f25aa1075d211/img/config_bg.jpg -------------------------------------------------------------------------------- /img/login_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ikaros-521/boa_cgi_html_mysql/9b6a309ceca109ce802041f45e6f25aa1075d211/img/login_bg.jpg -------------------------------------------------------------------------------- /img/login_head.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ikaros-521/boa_cgi_html_mysql/9b6a309ceca109ce802041f45e6f25aa1075d211/img/login_head.jpg -------------------------------------------------------------------------------- /img/login_head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ikaros-521/boa_cgi_html_mysql/9b6a309ceca109ce802041f45e6f25aa1075d211/img/login_head.png -------------------------------------------------------------------------------- /img/register_head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ikaros-521/boa_cgi_html_mysql/9b6a309ceca109ce802041f45e6f25aa1075d211/img/register_head.png -------------------------------------------------------------------------------- /js/my.js: -------------------------------------------------------------------------------- 1 | 112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | register 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 121 | 122 | 123 | 124 | 127 |
128 |
129 |
130 |

用户名:

  131 |
132 |
133 |

密   码:

  134 | 135 | 136 | 137 |
138 | 139 |
140 | 141 |                  142 | 143 |
144 |
145 |
146 |
147 | 150 |
151 | 152 | 153 | -------------------------------------------------------------------------------- /register.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | register 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 123 | 124 | 125 | 126 | 129 |
130 |
131 |
132 |

用  户  名:

133 |
134 |
135 |

密       码:

136 | 137 | 138 | 139 |
140 |
141 |

确认密码:

142 | 143 | 144 | 145 |
146 |
147 | 148 |          149 | 150 |
151 |
152 |
153 |
154 | 157 |
158 | 159 | 160 | -------------------------------------------------------------------------------- /upload.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | upload 7 | 8 | 9 | 10 | 11 | 12 | 61 | 62 | 63 | 64 |

目录权限,程序权限记得都给上

65 |
66 | 67 |
68 |
71 | -- 72 |
73 |
74 |
75 | 76 |
77 | 78 | -------------------------------------------------------------------------------- /环境搭建参考/apache.txt: -------------------------------------------------------------------------------- 1 | sudo apt-get install apache2 2 | -------------------------------------------------------------------------------- /环境搭建参考/boa-0.94.13.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ikaros-521/boa_cgi_html_mysql/9b6a309ceca109ce802041f45e6f25aa1075d211/环境搭建参考/boa-0.94.13.tar.gz -------------------------------------------------------------------------------- /环境搭建参考/boa-0.94.13.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ikaros-521/boa_cgi_html_mysql/9b6a309ceca109ce802041f45e6f25aa1075d211/环境搭建参考/boa-0.94.13.zip -------------------------------------------------------------------------------- /环境搭建参考/boa.conf: -------------------------------------------------------------------------------- 1 | # cumentRoot /var/www 2 | #将cgi保存的实际位置和网站地址做个对应 3 | # ScriptAlias /cgi-bin/ /var/www/cgi-bin/ 4 | #cgi脚本运行时能看到的$PATH(可选) 5 | # CGIPath /bin:/usr/bin:/usr/local/bin 6 | #如果想在任何位置都能运行cgi,要添加这个(可选) 7 | AddType application/x-httpd-cgi cgi 8 | # Boa v0.94 configuration file 9 | # File format has not changed from 0.93 10 | # File format has changed little from 0.92 11 | # version changes are noted in the comments 12 | # 13 | # The Boa configuration file is parsed with a lex/yacc or flex/bison 14 | # generated parser. If it reports an error, the line number will be 15 | # provided; it should be easy to spot. The syntax of each of these 16 | # rules is very simple, and they can occur in any order. Where possible 17 | # these directives mimic those of NCSA httpd 1.3; I saw no reason to 18 | # introduce gratuitous differences. 19 | 20 | # $Id: boa.conf,v 1.25 2002/03/22 04:33:09 jnelson Exp $ 21 | 22 | # The "ServerRoot" is not in this configuration file. It can be compiled 23 | # into the server (see defines.h) or specified on the command line with 24 | # the -c option, for example: 25 | # 26 | # boa -c /usr/local/boa 27 | 28 | 29 | # Port: The port Boa runs on. The default port for http servers is 80. 30 | # If it is less than 1024, the server must be started as root. 31 | 32 | Port 886 33 | 34 | # Listen: the Internet address to bind(2) to. If you leave it out, 35 | # it takes the behavior before 0.93.17.2, which is to bind to all 36 | # addresses (INADDR_ANY). You only get one "Listen" directive, 37 | # if you want service on multiple IP addresses, you have three choices: 38 | # 1. Run boa without a "Listen" directive 39 | # a. All addresses are treated the same; makes sense if the addresses 40 | # are localhost, ppp, and eth0. 41 | # b. Use the VirtualHost directive below to point requests to different 42 | # files. Should be good for a very large number of addresses (web 43 | # hosting clients). 44 | # 2. Run one copy of boa per IP address, each has its own configuration 45 | # with a "Listen" directive. No big deal up to a few tens of addresses. 46 | # Nice separation between clients. 47 | # The name you provide gets run through inet_aton(3), so you have to use dotted 48 | # quad notation. This configuration is too important to trust some DNS. 49 | 50 | #Listen 192.68.0.5 51 | 52 | # User: The name or UID the server should run as. 53 | # Group: The group name or GID the server should run as. 54 | 55 | User root 56 | Group root 57 | 58 | # ServerAdmin: The email address where server problems should be sent. 59 | # Note: this is not currently used, except as an environment variable 60 | # for CGIs. 61 | 62 | #ServerAdmin root@localhost 63 | 64 | # ErrorLog: The location of the error log file. If this does not start 65 | # with /, it is considered relative to the server root. 66 | # Set to /dev/null if you don't want errors logged. 67 | # If unset, defaults to /dev/stderr 68 | 69 | ErrorLog /var/log/boa/error_log 70 | # Please NOTE: Sending the logs to a pipe ('|'), as shown below, 71 | # is somewhat experimental and might fail under heavy load. 72 | # "Usual libc implementations of printf will stall the whole 73 | # process if the receiving end of a pipe stops reading." 74 | #ErrorLog "|/usr/sbin/cronolog --symlink=/var/log/boa/error_log /var/log/boa/error-%Y%m%d.log" 75 | 76 | # AccessLog: The location of the access log file. If this does not 77 | # start with /, it is considered relative to the server root. 78 | # Comment out or set to /dev/null (less effective) to disable 79 | # Access logging. 80 | 81 | 82 | # AccessLog /var/log/boa/access_log 83 | 84 | 85 | # Please NOTE: Sending the logs to a pipe ('|'), as shown below, 86 | # is somewhat experimental and might fail under heavy load. 87 | # "Usual libc implementations of printf will stall the whole 88 | # process if the receiving end of a pipe stops reading." 89 | #AccessLog "|/usr/sbin/cronolog --symlink=/var/log/boa/access_log /var/log/boa/access-%Y%m%d.log" 90 | 91 | # UseLocaltime: Logical switch. Uncomment to use localtime 92 | # instead of UTC time 93 | #UseLocaltime 94 | 95 | # VerboseCGILogs: this is just a logical switch. 96 | # It simply notes the start and stop times of cgis in the error log 97 | # Comment out to disable. 98 | 99 | #VerboseCGILogs 100 | 101 | # ServerName: the name of this server that should be sent back to 102 | # clients if different than that returned by gethostname + gethostbyname 103 | 104 | ServerName www.your.org.here 105 | 106 | # VirtualHost: a logical switch. 107 | # Comment out to disable. 108 | # Given DocumentRoot /var/www, requests on interface 'A' or IP 'IP-A' 109 | # become /var/www/IP-A. 110 | # Example: http://localhost/ becomes /var/www/127.0.0.1 111 | # 112 | # Not used until version 0.93.17.2. This "feature" also breaks commonlog 113 | # output rules, it prepends the interface number to each access_log line. 114 | # You are expected to fix that problem with a postprocessing script. 115 | 116 | #VirtualHost 117 | 118 | # DocumentRoot: The root directory of the HTML documents. 119 | # Comment out to disable server non user files. 120 | 121 | DocumentRoot /var/www 122 | 123 | # UserDir: The name of the directory which is appended onto a user's home 124 | # directory if a ~user request is recieved. 125 | 126 | UserDir public_html 127 | 128 | # DirectoryIndex: Name of the file to use as a pre-written HTML 129 | # directory index. Please MAKE AND USE THESE FILES. On the 130 | # fly creation of directory indexes can be _slow_. 131 | # Comment out to always use DirectoryMaker 132 | 133 | DirectoryIndex index.html 134 | 135 | # DirectoryMaker: Name of program used to create a directory listing. 136 | # Comment out to disable directory listings. If both this and 137 | # DirectoryIndex are commented out, accessing a directory will give 138 | # an error (though accessing files in the directory are still ok). 139 | 140 | DirectoryMaker /usr/lib/boa/boa_indexer 141 | 142 | # DirectoryCache: If DirectoryIndex doesn't exist, and DirectoryMaker 143 | # has been commented out, the the on-the-fly indexing of Boa can be used 144 | # to generate indexes of directories. Be warned that the output is 145 | # extremely minimal and can cause delays when slow disks are used. 146 | # Note: The DirectoryCache must be writable by the same user/group that 147 | # Boa runs as. 148 | 149 | # DirectoryCache /var/spool/boa/dircache 150 | 151 | # KeepAliveMax: Number of KeepAlive requests to allow per connection 152 | # Comment out, or set to 0 to disable keepalive processing 153 | 154 | KeepAliveMax 1000 155 | 156 | # KeepAliveTimeout: seconds to wait before keepalive connection times out 157 | 158 | KeepAliveTimeout 10 159 | 160 | # MimeTypes: This is the file that is used to generate mime type pairs 161 | # and Content-Type fields for boa. 162 | # Set to /dev/null if you do not want to load a mime types file. 163 | # Do *not* comment out (better use AddType!) 164 | 165 | MimeTypes /etc/mime.types 166 | 167 | # DefaultType: MIME type used if the file extension is unknown, or there 168 | # is no file extension. 169 | 170 | DefaultType text/plain 171 | 172 | # CGIPath: The value of the $PATH environment variable given to CGI progs. 173 | 174 | CGIPath /bin:/usr/bin:/usr/local/bin 175 | 176 | # SinglePostLimit: The maximum allowable number of bytes in 177 | # a single POST. Default is normally 1MB. 178 | 179 | # AddType: adds types without editing mime.types 180 | # Example: AddType type extension [extension ...] 181 | 182 | # Uncomment the next line if you want .cgi files to execute from anywhere 183 | #AddType application/x-httpd-cgi cgi 184 | 185 | # Redirect, Alias, and ScriptAlias all have the same semantics -- they 186 | # match the beginning of a request and take appropriate action. Use 187 | # Redirect for other servers, Alias for the same server, and ScriptAlias 188 | # to enable directories for script execution. 189 | 190 | # Redirect allows you to tell clients about documents which used to exist in 191 | # your server's namespace, but do not anymore. This allows you to tell the 192 | # clients where to look for the relocated document. 193 | # Example: Redirect /bar http://elsewhere/feh/bar 194 | 195 | # Aliases: Aliases one path to another. 196 | # Example: Alias /path1/bar /path2/foo 197 | 198 | Alias /doc /usr/doc 199 | 200 | # ScriptAlias: Maps a virtual path to a directory for serving scripts 201 | # Example: ScriptAlias /htbin/ /www/htbin/ 202 | 203 | ScriptAlias /cgi-bin/ /var/www/cgi-bin/ 204 | 205 | -------------------------------------------------------------------------------- /环境搭建参考/ccgi.txt: -------------------------------------------------------------------------------- 1 | **CGIC**的主站点: [http://www.boutell.com/cgic/] 2 | 配置参考大佬博客:[项目实战](https://blog.csdn.net/a642960662/article/category/6818637) 3 | -------------------------------------------------------------------------------- /环境搭建参考/cgic207.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ikaros-521/boa_cgi_html_mysql/9b6a309ceca109ce802041f45e6f25aa1075d211/环境搭建参考/cgic207.tar.gz -------------------------------------------------------------------------------- /环境搭建参考/相关链接.txt: -------------------------------------------------------------------------------- 1 | BOA 2 | [Ubuntu下boa服务器的配置与搭建](https://www.cnblogs.com/jasonxiang/archive/2012/10/17/ubuntu_boa.html) 3 | 大佬写的项目实战 https://blog.csdn.net/a642960662/article/category/6818637 4 | Apache CGI 5 | sudo apt-get install apache2 6 | [ubuntu 下搭建cgi环境](https://blog.csdn.net/heibaiyijing/article/details/8538413) 7 | CCGI 8 | **CGIC**的主站点: [http://www.boutell.com/cgic/] 9 | 配置参考大佬博客:[项目实战](https://blog.csdn.net/a642960662/article/category/6818637) 10 | 我在调试中遇到的问题也在大佬的博客下面做了 **评论** ,如果大家碰到问题可以参考一下。 11 | MySQL 12 | 安装MySQL数据库 13 | sudo apt-get update 14 | sudo apt-get install mysql-server 15 | 16 | 确认是否安装成功 17 | sudo netstat -tap | grep mysql 18 | 当mysql节点处于LISTEN状态表示启动成功 19 | 20 | 登录数据库 21 | mysql -u root -p 22 | 或者直接在-p后面跟密码,如下 23 | mysql -uroot -proot 24 | 再装个mysql-client, libmysqlclient-dev 25 | sudo apt-get install mysql-client 26 | sudo apt-get install libmysqlclient-dev 27 | 28 | // 创建新用户test 29 | create user 'test'@'localhost' identified by 'test'; 30 | // 给test用户所有权限 31 | grant all privileges on *.* to test@localhost identified by 'test' 32 | // 刷新权限 33 | flush privileges; 34 | 35 | 36 | 遇到问题可以参考我的博客 https://blog.csdn.net/Ikaros_521 37 | --------------------------------------------------------------------------------